이 문서는 지원되지 않는 Postgre스포츠 토토 베트맨 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.Postgre와이즈 토토 : 문서 : 17 : 34.7. 설명자 영역 사용버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

33.7. 설명 영역 사용

스포츠 토토 베트맨 설명자 영역은 다음을 위한 보다 정교한 방법입니다. a의 결과를 처리하는 중선택, 가져오기또는설명문장. 스포츠 토토 베트맨 설명자 영역 그룹 한 행의 데이터를 메타데이터 항목과 함께 하나로 데이터 구조. 메타데이터는 실행할 때 특히 유용합니다. 동적 스포츠 토토 베트맨 문, 결과 열의 특성 미리 알 수 없을 수도 있습니다. Postgre스포츠 토토 베트맨은 두 가지 방법을 제공합니다. 설명자 영역 사용: 명명된 스포츠 토토 베트맨 설명자 영역 및 C 구조 스포츠 토토 베트맨DA.

33.7.1. 명명된 스포츠 토토 베트맨 설명자 지역

명명된 스포츠 토토 베트맨 설명자 영역은 다음을 포함하는 헤더로 구성됩니다. 전체 설명자 및 하나 이상의 항목에 관한 정보 설명자 영역은 기본적으로 각각 하나의 열을 설명합니다. 결과 행.

스포츠 토토 베트맨 설명자 영역을 사용하기 전에 다음을 할당해야 합니다. 하나:

EXEC 스포츠 토토 베트맨 할당 설명자식별자;

식별자는 다음 역할을 합니다."변수 이름"11494_11590

EXEC 스포츠 토토 베트맨 할당 해제 설명자식별자;

설명자 영역을 사용하려면 해당 영역을 저장 대상으로 지정하십시오.INTO절, 호스트 나열 대신 변수:

EXEC 스포츠 토토 베트맨 FETCH NEXT FROM FROM FROM INTO 스포츠 토토 베트맨 DESCRIPTOR mydesc;

결과 집합이 비어 있으면 설명자 영역은 여전히 쿼리의 메타데이터, 즉 필드 이름을 포함합니다.

아직 실행되지 않은 준비된 쿼리의 경우,설명문을 사용하여 메타데이터를 가져올 수 있습니다. 결과 집합 중:

EXEC 스포츠 토토 베트맨 시작 선언 섹션;
char *sql_stmt = "SELECT * FROM table1";
EXEC 스포츠 토토 베트맨 END 선언 섹션;

EXEC 스포츠 토토 베트맨 PREPARE stmt1 FROM :sql_stmt;
EXEC 스포츠 토토 베트맨 DESCRIBE stmt1 INTO 스포츠 토토 베트맨 DESCRIPTOR mydesc;

Postgre스포츠 토토 베트맨 9.0 이전에는스포츠 토토 베트맨키워드 선택 사항이므로 다음을 사용합니다.설명자그리고스포츠 토토 베트맨 설명자스포츠 토토 베트맨이라는 이름을 생성함 설명자 영역. 이제는 필수이며,을 생략합니다.스포츠 토토 베트맨키워드는 스포츠 토토 베트맨DA 설명자 영역을 생성합니다. 참조섹션 33.7.2.

설명그리고가져오기문장, 그INTO그리고사용 중키워드를 사용하면 마찬가지로 결과 세트와 메타데이터를 생성합니다. 설명 영역.

이제 설명자 영역에서 데이터를 어떻게 가져오나요? 당신은 할 수 있습니다 설명자 영역을 명명된 필드가 있는 구조로 생각하세요. 받는 사람 헤더에서 필드 값을 검색하여 헤더에 저장합니다. 호스트 변수에는 다음 명령을 사용하십시오.

EXEC 스포츠 토토 베트맨 GET 설명자이름 :hostvar = 필드;

현재 정의된 헤더 필드는 단 하나입니다:개수, 항목 설명자가 몇 개인지 알려줍니다. 영역이 존재합니다(즉, 해당 영역에 얼마나 많은 열이 포함되어 있는지). 결과). 호스트 변수는 정수 유형이어야 합니다. 얻으려면 항목 설명 영역의 필드에서 다음 명령을 사용하십시오.

EXEC 스포츠 토토 베트맨 GET 설명자이름num :hostvar = 필드;

번호리터럴 정수일 수 있습니다. 정수를 포함하는 호스트 변수. 가능한 필드는 다음과 같습니다:

카디널리티(정수)

결과 세트의 행 수

데이터

실제 데이터 항목(따라서 이 필드의 데이터 유형은 쿼리에)

DATETIME_INTERVAL_CODE(정수)

언제유형is9, DATETIME_INTERVAL_CODE값은1for날짜, 2for시간, 3for타임스탬프, 4for시간대 포함 시간또는5for시간대가 포함된 타임스탬프.

DATETIME_INTERVAL_PRECISION(정수)

구현되지 않음

표시기(정수)

표시기(널 값 또는 값을 나타냄) 잘림)

KEY_MEMBER(정수)

구현되지 않음

길이(정수)

문자 단위의 데이텀 길이

이름(문자열)

열 이름

NULL 가능(정수)

구현되지 않음

OCTET_LE스포츠 토토 베트맨TH(정수)

데이텀의 문자 표현 길이(바이트)

정확성(정수)

정밀도(유형용숫자)

RETURNED_LE스포츠 토토 베트맨TH(정수)

문자 단위의 데이텀 길이

RETURNED_OCTET_LE스포츠 토토 베트맨TH(정수)

데이텀의 문자 표현 길이(바이트)

규모(정수)

규모(유형용숫자)

TYPE(정수)

컬럼의 데이터 유형의 숫자 코드

실행, 선언그리고열기진술, 효과INTO그리고사용 중키워드가 다릅니다. 설명자 영역을 수동으로 구축하여 다음에 대한 입력 매개변수를 제공할 수도 있습니다. 쿼리 또는 커서 및스포츠 토토 베트맨 설명자 사용이름이것은 통과하는 길입니다 매개변수화된 쿼리에 매개변수를 입력합니다. 빌드할 명령문 명명된 스포츠 토토 베트맨 설명자 영역은 다음과 같습니다.

EXEC 스포츠 토토 베트맨 세트 설명자이름num 필드 = :hostvar;

Postgre스포츠 토토 베트맨은 하나에서 둘 이상의 레코드 검색을 지원합니다.가져오기문을 작성하고 데이터를 저장하는 위치 이 경우 호스트 변수는 변수가 배열이라고 가정합니다. 예:

EXEC 스포츠 토토 베트맨 시작 선언 섹션;
정수 아이디[5];
EXEC 스포츠 토토 베트맨 END 선언 섹션;

EXEC 스포츠 토토 베트맨 FETCH 5 mycursor INTO 스포츠 토토 베트맨 DESCRIPTOR mydesc;

EXEC 스포츠 토토 베트맨 GET 설명자 mydesc VALUE 1 :id = DATA;

33.7.2. 스포츠 토토 베트맨DA 설명자 영역

스포츠 토토 베트맨DA 설명자 영역은 다음과 같은 C 언어 구조입니다. 쿼리의 결과 집합과 메타데이터를 가져오는 데에도 사용됩니다. 하나 구조는 결과 세트에서 하나의 레코드를 저장합니다.

EXEC 스포츠 토토 베트맨에는 스포츠 토토 베트맨da.h가 포함됩니다.
스포츠 토토 베트맨da_t *my스포츠 토토 베트맨da;

EXEC 스포츠 토토 베트맨 FETCH 3을 mycursor에서 설명자 my스포츠 토토 베트맨da로;

참고하세요스포츠 토토 베트맨키워드가 생략되었습니다. 의 사용 사례에 대한 단락INTO그리고사용 중키워드섹션 33.7.1또한 여기에 추가로 적용됩니다. 에서설명진술설명자다음과 같은 경우 키워드를 완전히 생략할 수 있습니다.INTO키워드가 사용되었습니다:

EXEC 스포츠 토토 베트맨 DESCRIBE prepare_statement INTO my스포츠 토토 베트맨da;

스포츠 토토 베트맨DA를 사용하는 프로그램의 일반적인 흐름은 다음과 같습니다.

  1. 쿼리를 준비하고 이에 대한 커서를 선언하십시오.

  2. 결과 행에 대해 스포츠 토토 베트맨DA를 선언하십시오.

  3. 입력 매개변수에 대한 스포츠 토토 베트맨DA 선언 및 초기화 (메모리 할당, 매개변수 설정).

  4. 입력 스포츠 토토 베트맨DA로 커서를 엽니다.

  5. 커서에서 행을 가져와 출력에 저장합니다. 스포츠 토토 베트맨DA.

  6. 출력 스포츠 토토 베트맨DA의 값을 호스트 변수로 읽습니다( 필요한 경우 변환).

  7. 커서를 닫으세요.

  8. 입력 스포츠 토토 베트맨DA에 할당된 메모리 영역을 해제합니다.

33.7.2.1. 스포츠 토토 베트맨DA 데이터 구조

스포츠 토토 베트맨DA는 세 가지 데이터 구조 유형을 사용합니다.스포츠 토토 베트맨da_t, 스포츠 토토 베트맨var_t구조체 스포츠 토토 베트맨name.

팁:Postgre스포츠 토토 베트맨의 스포츠 토토 베트맨DA는 다음과 유사한 데이터 구조를 가지고 있습니다. IBM DB2 Universal Database에 있는 것이므로 일부 기술적 DB2의 스포츠 토토 베트맨DA에 대한 정보는 Postgre스포츠 토토 베트맨을 이해하는 데 도움이 될 수 있습니다. 하나 더 좋아.

33.7.2.1.1. 스포츠 토토 베트맨da_t 구조

구조 유형스포츠 토토 베트맨da_t다음 유형입니다. 실제 스포츠 토토 베트맨DA. 하나의 기록을 보유하고 있습니다. 그리고 2개 이상스포츠 토토 베트맨da_t구조는 연결리스트로 연결될 수 있습니다 포인터를 사용하여desc_next필드로, 순서가 지정된 행 모음을 나타냅니다. 그래서 언제 두 개 이상의 행을 가져오면 애플리케이션이 이를 읽을 수 있습니다. 다음desc_next포인터 각각스포츠 토토 베트맨da_t노드.

의 정의스포츠 토토 베트맨da_t다음과 같습니다:

구조체 스포츠 토토 베트맨da_struct

    char 스포츠 토토 베트맨daid[8];
    긴 스포츠 토토 베트맨dabc;
    짧은 스포츠 토토 베트맨n;
    짧은 스포츠 토토 베트맨d;
    구조체 스포츠 토토 베트맨da_struct *desc_next;
    구조체 스포츠 토토 베트맨var_struct 스포츠 토토 베트맨var[1];
;

typedef 구조체 스포츠 토토 베트맨da_struct 스포츠 토토 베트맨da_t;

필드의 의미는 다음과 같습니다:

스포츠 토토 베트맨daid

리터럴 문자열이 포함되어 있습니다."스포츠 토토 베트맨DA ".

스포츠 토토 베트맨dabc

할당된 공간의 크기를 바이트 단위로 담고 있습니다.

스포츠 토토 베트맨n

매개변수화된 입력 매개변수의 개수가 포함되어 있습니다. 전달된 경우 쿼리열기, 선언또는실행다음을 사용하는 문사용 중키워드. 의 출력으로 사용되는 경우선택, 실행또는가져오기문, 그 값은 동일합니다. 와 같이스포츠 토토 베트맨d성명

스포츠 토토 베트맨d

결과 세트의 필드 수를 포함합니다.

desc_next

쿼리가 하나 이상의 레코드를 반환하는 경우 여러 개의 연결된 스포츠 토토 베트맨DA 구조체가 반환되고,desc_next목록의 다음 항목에 대한 포인터를 보유합니다.

스포츠 토토 베트맨var

이것은 결과 집합의 열 배열입니다.

33.7.2.1.2. 스포츠 토토 베트맨var_t 구조

구조 유형스포츠 토토 베트맨var_t열을 보유하고 있습니다 유형, 길이 등의 값과 메타데이터. 의 정의 유형은 다음과 같습니다:

구조체 스포츠 토토 베트맨var_struct

    짧은 스포츠 토토 베트맨type;
    짧은 스포츠 토토 베트맨len;
    char *스포츠 토토 베트맨data;
    짧은 *스포츠 토토 베트맨ind;
    구조체 스포츠 토토 베트맨name 스포츠 토토 베트맨name;
;

typedef struct 스포츠 토토 베트맨var_struct 스포츠 토토 베트맨var_t;

필드의 의미는 다음과 같습니다:

스포츠 토토 베트맨type

필드의 유형 식별자를 포함합니다. 값은 다음을 참조하세요.enum ECPGttypeecpgtype.h.

스포츠 토토 베트맨len

필드의 바이너리 길이를 포함합니다. 예를 들어 4바이트:ECPGt_int.

스포츠 토토 베트맨data

데이터를 가리킵니다. 데이터 형식은에 설명되어 있습니다.섹션 33.4.4.

스포츠 토토 베트맨ind

널 표시기를 가리킵니다. 0은 null이 아님을 의미하고 -1은 null이 아님을 의미합니다. 널.

스포츠 토토 베트맨name

필드의 이름.

33.7.2.1.3. struct 스포츠 토토 베트맨name 구조

A 구조체 스포츠 토토 베트맨name구조에는 열이 있습니다. 이름. 의 멤버로 사용됩니다.스포츠 토토 베트맨var_t구조. 구조의 정의는 다음과 같습니다.

#define NAMEDATALEN 64

구조체 스포츠 토토 베트맨 이름

        짧은 길이;
        문자 데이터[NAMEDATALEN];
;

필드의 의미는 다음과 같습니다:

길이

필드 이름의 길이를 포함합니다.

데이터

실제 필드 이름이 포함되어 있습니다.

33.7.2.2. 다음을 사용하여 결과 세트 검색 스포츠 토토 베트맨DA

질의 결과 집합을 검색하는 일반적인 단계는 스포츠 토토 베트맨DA는 다음과 같습니다.

  1. 선언스포츠 토토 베트맨da_t수신할 구조 결과 집합입니다.

  2. 실행가져오기/실행/설명명령 선언된 스포츠 토토 베트맨DA를 지정하는 쿼리를 처리합니다.

  3. 다음을 보고 결과 집합의 레코드 수를 확인하세요.스포츠 토토 베트맨n,의 회원스포츠 토토 베트맨da_t구조.

  4. 다음에서 각 열의 값을 가져옵니다스포츠 토토 베트맨var[0], 스포츠 토토 베트맨var[1]등, 의 멤버스포츠 토토 베트맨da_t구조.

  5. 다음 행으로 이동(스포츠 토토 베트맨da_t구조) by 다음desc_next포인터, 의 회원스포츠 토토 베트맨da_t구조.

  6. 필요에 따라 위 내용을 반복하세요.

다음은 스포츠 토토 베트맨DA를 통해 결과 집합을 검색하는 예입니다.

먼저, 다음을 선언하세요.스포츠 토토 베트맨da_t구조 결과 세트를 받습니다.

스포츠 토토 베트맨da_t *스포츠 토토 베트맨da1;

다음으로, 명령에 스포츠 토토 베트맨DA를 지정하세요. 이것은가져오기명령 예.

EXEC 스포츠 토토 베트맨 FETCH NEXT FROM INTO DESCRIPTOR 스포츠 토토 베트맨da1;

행을 검색하려면 연결된 목록을 따라 루프를 실행하세요.

스포츠 토토 베트맨da_t *cur_스포츠 토토 베트맨da;

(cur_스포츠 토토 베트맨da = 스포츠 토토 베트맨da1;
     cur_스포츠 토토 베트맨da != NULL;
     cur_스포츠 토토 베트맨da = cur_스포츠 토토 베트맨da-desc_next)

    ...

루프 내에서 또 다른 루프를 실행하여 각 열 데이터를 검색합니다. (스포츠 토토 베트맨var_t구조) 행의 구조입니다.

for (i = 0; i < cur_스포츠 토토 베트맨da-스포츠 토토 베트맨d; i++)

    스포츠 토토 베트맨var_t v = cur_스포츠 토토 베트맨da-스포츠 토토 베트맨var[i];
    char *스포츠 토토 베트맨data = v.스포츠 토토 베트맨data;
    짧은 스포츠 토토 베트맨len = v.스포츠 토토 베트맨len;
    ...

열 값을 얻으려면 다음을 확인하세요.스포츠 토토 베트맨type값, 구성원스포츠 토토 베트맨var_t구조. 그런 다음 적절한 방법으로 전환하십시오. 열 유형에 따라,스포츠 토토 베트맨var필드를 호스트 변수로 변환합니다.

char var_buf[1024];

스위치(v.스포츠 토토 베트맨type)

    사례 ECPGt_char:
        memset(&var_buf, 0, sizeof(var_buf));
        memcpy(&var_buf, 스포츠 토토 베트맨data, (sizeof(var_buf) <= 스포츠 토토 베트맨len ? sizeof(var_buf) - 1 : 스포츠 토토 베트맨len));
        부서지다;

    case ECPGt_int: /* 정수 */
        memcpy(&intval, 스포츠 토토 베트맨data, 스포츠 토토 베트맨len);
        snprintf(var_buf, sizeof(var_buf), "%d", intval);
        부서지다;

    ...

33.7.2.3. 다음을 사용하여 쿼리 매개변수 전달 스포츠 토토 베트맨DA

스포츠 토토 베트맨DA를 사용하여 입력 매개변수를 준비된 쿼리는 다음과 같습니다.

  1. 준비된 쿼리 생성(준비된 명령문)

  2. 스포츠 토토 베트맨da_t 구조를 입력 스포츠 토토 베트맨DA로 선언하십시오.

  3. 입력을 위한 메모리 영역(스포츠 토토 베트맨da_t 구조로) 할당 스포츠 토토 베트맨DA.

  4. 할당된 메모리에 입력 값을 설정(복사)합니다.

  5. 입력 스포츠 토토 베트맨DA를 지정하여 커서를 엽니다.

여기에 예가 있습니다.

먼저, 준비된 명령문을 만드세요.

EXEC 스포츠 토토 베트맨 시작 선언 섹션;
char query[1024] = "SELECT d.oid, * FROM pg_database d, pg_stat_database s WHERE d.oid = s.datid AND (d.datname = ? OR d.oid = ?)";
EXEC 스포츠 토토 베트맨 END 선언 섹션;

EXEC 스포츠 토토 베트맨 PREPARE stmt1 FROM :query;

다음으로 스포츠 토토 베트맨DA에 메모리를 할당하고 입력 개수를 설정합니다. 매개변수스포츠 토토 베트맨n, 멤버 변수 의스포츠 토토 베트맨da_t구조. 2개 이상일 때 준비된 쿼리에는 입력 매개변수가 필요합니다. 애플리케이션은 추가 메모리 공간을 할당해야 합니다. (매개변수 수 - 1) * sizeof(스포츠 토토 베트맨var_t)로 계산됩니다. 예 여기에 표시된 두 개의 입력 매개변수에 대한 메모리 공간을 할당합니다.

스포츠 토토 베트맨da_t *스포츠 토토 베트맨da2;

스포츠 토토 베트맨da2 = (스포츠 토토 베트맨da_t *) malloc(sizeof(스포츠 토토 베트맨da_t) + sizeof(스포츠 토토 베트맨var_t));
memset(스포츠 토토 베트맨da2, 0, sizeof(스포츠 토토 베트맨da_t) + sizeof(스포츠 토토 베트맨var_t));

스포츠 토토 베트맨da2-스포츠 토토 베트맨n = 2; /* 입력 변수 개수 */

메모리 할당 후 매개변수 값을 다음 위치에 저장하세요.스포츠 토토 베트맨var[]배열. (이것은 동일한 배열이 사용되었습니다. 스포츠 토토 베트맨DA가 결과를 수신할 때 열 값을 검색하기 위해 설정합니다.) 이 예에서 입력 매개변수는 다음과 같습니다."포스트그레스", 문자열 유형을 가지며1, 정수 유형을 가집니다.

스포츠 토토 베트맨da2-스포츠 토토 베트맨var[0].스포츠 토토 베트맨type = ECPGt_char;
스포츠 토토 베트맨da2-스포츠 토토 베트맨var[0].스포츠 토토 베트맨data = "포스트그레스";
스포츠 토토 베트맨da2-스포츠 토토 베트맨var[0].스포츠 토토 베트맨len = 8;

int intval = 1;
스포츠 토토 베트맨da2-스포츠 토토 베트맨var[1].스포츠 토토 베트맨type = ECPGt_int;
스포츠 토토 베트맨da2-스포츠 토토 베트맨var[1].스포츠 토토 베트맨data = (char *) &intval;
스포츠 토토 베트맨da2-스포츠 토토 베트맨var[1].스포츠 토토 베트맨len = sizeof(intval);

커서를 열고 설정된 스포츠 토토 베트맨DA를 지정하여 미리 입력 매개변수가 준비된 진술.

설명자 스포츠 토토 베트맨da2를 사용하여 EXEC 스포츠 토토 베트맨 OPEN cur1;

마지막으로 입력 스포츠 토토 베트맨DA를 사용한 후 할당된 메모리 공간 쿼리 수신에 사용되는 스포츠 토토 베트맨DA와 달리 명시적으로 해제되어야 합니다. 결과.

무료(스포츠 토토 베트맨da2);

33.7.2.4. 다음을 사용한 샘플 애플리케이션 스포츠 토토 베트맨DA

다음은 액세스 권한을 가져오는 방법을 설명하는 예제 프로그램입니다. 입력 매개변수로 지정된 데이터베이스 통계 시스템 카탈로그에서.

이 응용 프로그램은 두 개의 시스템 테이블 pg_database 및 데이터베이스 OID의 pg_stat_database 및 가져오기 및 표시 두 개의 입력 매개변수로 검색된 데이터베이스 통계 (데이터베이스포스트그레및 OID1).

먼저, 입력용 스포츠 토토 베트맨DA와 출력용 스포츠 토토 베트맨DA를 선언하세요.

EXEC 스포츠 토토 베트맨에는 스포츠 토토 베트맨da.h가 포함됩니다.

스포츠 토토 베트맨da_t *스포츠 토토 베트맨da1; /* 출력 설명자 */
스포츠 토토 베트맨da_t *스포츠 토토 베트맨da2; /* 입력 설명자 */

다음으로, 데이터베이스에 연결하고 명령문을 준비하고 선언하세요 준비된 명령문에 대한 커서입니다.

정수
메인(공허)

    EXEC 스포츠 토토 베트맨 시작 선언 섹션;
    char query[1024] = "d.oid 선택,* pg_database d, pg_stat_database s WHERE d.oid=s.datid AND ( d.datname=? OR d.oid=? )";
    EXEC 스포츠 토토 베트맨 END 선언 섹션;

    EXEC 스포츠 토토 베트맨 CONNECT TO testdb AS con1 USER testuser;
    EXEC 스포츠 토토 베트맨 SELECT pg_catalog.set_config('search_path', '', false); EXEC 스포츠 토토 베트맨 커밋;

    EXEC 스포츠 토토 베트맨 PREPARE stmt1 FROM :query;
    EXEC 스포츠 토토 베트맨 선언 cur1 stmt1에 대한 커서;

다음으로, 입력에 대한 입력 스포츠 토토 베트맨DA에 일부 값을 입력하십시오. 매개변수. 입력 스포츠 토토 베트맨DA에 대한 메모리를 할당하고 개수를 설정합니다. 입력 매개변수 수스포츠 토토 베트맨n. 매장 유형, 값 및 값 길이스포츠 토토 베트맨type, 스포츠 토토 베트맨data스포츠 토토 베트맨len스포츠 토토 베트맨var구조.

/* 입력 매개변수에 대한 스포츠 토토 베트맨DA 구조를 생성합니다. */
    스포츠 토토 베트맨da2 = (스포츠 토토 베트맨da_t *) malloc(sizeof(스포츠 토토 베트맨da_t) + sizeof(스포츠 토토 베트맨var_t));
    memset(스포츠 토토 베트맨da2, 0, sizeof(스포츠 토토 베트맨da_t) + sizeof(스포츠 토토 베트맨var_t));
    스포츠 토토 베트맨da2-스포츠 토토 베트맨n = 2; /* 입력 변수 개수 */

    스포츠 토토 베트맨da2-스포츠 토토 베트맨var[0].스포츠 토토 베트맨type = ECPGt_char;
    스포츠 토토 베트맨da2-스포츠 토토 베트맨var[0].스포츠 토토 베트맨data = "포스트그레스";
    스포츠 토토 베트맨da2-스포츠 토토 베트맨var[0].스포츠 토토 베트맨len = 8;

    간격 = 1;
    스포츠 토토 베트맨da2-스포츠 토토 베트맨var[1].스포츠 토토 베트맨type = ECPGt_int;
    스포츠 토토 베트맨da2-스포츠 토토 베트맨var[1].스포츠 토토 베트맨data = (char *)&intval;
    스포츠 토토 베트맨da2-스포츠 토토 베트맨var[1].스포츠 토토 베트맨len = sizeof(intval);

입력 스포츠 토토 베트맨DA를 설정한 후 입력으로 커서를 엽니다. 스포츠 토토 베트맨DA.

/* 입력 매개변수로 커서를 엽니다. */
    설명자를 사용하여 EXEC 스포츠 토토 베트맨 OPEN cur1 스포츠 토토 베트맨da2;

열린 커서에서 출력 스포츠 토토 베트맨DA로 행을 가져옵니다. (일반적으로 전화를 하셔야 합니다.)가져오기루프에서 반복적으로 결과 집합의 모든 행을 가져옵니다.)

그 동안 (1)

        스포츠 토토 베트맨da_t *cur_스포츠 토토 베트맨da;

        /* 커서에 설명자를 할당 */
        EXEC 스포츠 토토 베트맨은 cur1에서 설명자 스포츠 토토 베트맨da1로 다음 항목을 가져옵니다.

다음으로, 다음과 같이 스포츠 토토 베트맨DA에서 가져온 레코드를 검색합니다. 의 연결 리스트스포츠 토토 베트맨da_t구조.

for (cur_스포츠 토토 베트맨da = 스포츠 토토 베트맨da1 ;
         cur_스포츠 토토 베트맨da != NULL ;
         cur_스포츠 토토 베트맨da = cur_스포츠 토토 베트맨da-desc_next)

        ...

첫 번째 레코드의 각 열을 읽습니다. 열의 수는 에 저장됨스포츠 토토 베트맨d, 실제 데이터는 첫 번째 열은에 저장됩니다.스포츠 토토 베트맨var[0], 둘 다 의 멤버스포츠 토토 베트맨da_t구조.

/* 행의 모든 열을 인쇄합니다. */
        for (i = 0; i < 스포츠 토토 베트맨da1-스포츠 토토 베트맨d; i++)

            스포츠 토토 베트맨var_t v = 스포츠 토토 베트맨da1-스포츠 토토 베트맨var[i];
            char *스포츠 토토 베트맨data = v.스포츠 토토 베트맨data;
            짧은 스포츠 토토 베트맨len = v.스포츠 토토 베트맨len;

            strncpy(name_buf, v.스포츠 토토 베트맨name.data, v.스포츠 토토 베트맨name.length);
            name_buf[v.스포츠 토토 베트맨name.length] = '\0';

이제 열 데이터가 변수에 저장되었습니다.v. 모든 데이터를 호스트 변수에 복사하여 다음을 살펴보세요.v.스포츠 토토 베트맨type열 유형에 대해.

스위치(v.스포츠 토토 베트맨type) 
                int 간격;
                이중 이중발;
                부호 없는 long long int longlongval;

                사례 ECPGt_char:
                    memset(&var_buf, 0, sizeof(var_buf));
                    memcpy(&var_buf, 스포츠 토토 베트맨data, (sizeof(var_buf) <= 스포츠 토토 베트맨len ? sizeof(var_buf)-1 : 스포츠 토토 베트맨len));
                    부서지다;

                case ECPGt_int: /* 정수 */
                    memcpy(&intval, 스포츠 토토 베트맨data, 스포츠 토토 베트맨len);
                    snprintf(var_buf, sizeof(var_buf), "%d", intval);
                    부서지다;

                ...

                기본값:
                    ...

            printf("%s = %s (유형: %d)\n", name_buf, var_buf, v.스포츠 토토 베트맨type);

모든 레코드를 처리한 후 커서를 닫고 연결을 끊습니다. 데이터베이스에서.

EXEC 스포츠 토토 베트맨 CLOSE cur1;
    EXEC 스포츠 토토 베트맨 커밋;

    EXEC 스포츠 토토 베트맨 모두 연결 해제;

전체 프로그램은 다음에 표시됩니다.예 33-1.

예 33-1. 스포츠 토토 베트맨DA 프로그램 예

#include <stdlib.h
#include <문자열.h
#include <stdlib.h
#include <stdio.h
#include <unistd.h

EXEC 스포츠 토토 베트맨에는 스포츠 토토 베트맨da.h가 포함됩니다.

스포츠 토토 베트맨da_t *스포츠 토토 베트맨da1; /* 출력 설명자 */
스포츠 토토 베트맨da_t *스포츠 토토 베트맨da2; /* 입력 설명자 */

EXEC 스포츠 토토 베트맨을 찾을 수 없을 때 중단하십시오.
스포츠 토토 베트맨ERROR가 중지될 때마다 EXEC 스포츠 토토 베트맨;

정수
메인(공허)

    EXEC 스포츠 토토 베트맨 시작 선언 섹션;
    char query[1024] = "d.oid 선택,* pg_database d, pg_stat_database s WHERE d.oid=s.datid AND ( d.datname=? OR d.oid=? )";

    int 간격;
    부호 없는 long long int longlongval;
    EXEC 스포츠 토토 베트맨 END 선언 섹션;

    EXEC 스포츠 토토 베트맨 CONNECT TO uptimedb AS con1 사용자 가동 시간;
    EXEC 스포츠 토토 베트맨 SELECT pg_catalog.set_config('search_path', '', false); EXEC 스포츠 토토 베트맨 커밋;

    EXEC 스포츠 토토 베트맨 PREPARE stmt1 FROM :query;
    EXEC 스포츠 토토 베트맨 DECLARE cur1 stmt1에 대한 커서;

    /* 입력 매개변수에 대한 스포츠 토토 베트맨DA 구조 생성 */
    스포츠 토토 베트맨da2 = (스포츠 토토 베트맨da_t *)malloc(sizeof(스포츠 토토 베트맨da_t) + sizeof(스포츠 토토 베트맨var_t));
    memset(스포츠 토토 베트맨da2, 0, sizeof(스포츠 토토 베트맨da_t) + sizeof(스포츠 토토 베트맨var_t));
    스포츠 토토 베트맨da2-스포츠 토토 베트맨n = 2; /* 입력 변수의 개수 */

    스포츠 토토 베트맨da2-스포츠 토토 베트맨var[0].스포츠 토토 베트맨type = ECPGt_char;
    스포츠 토토 베트맨da2-스포츠 토토 베트맨var[0].스포츠 토토 베트맨data = "포스트그레스";
    스포츠 토토 베트맨da2-스포츠 토토 베트맨var[0].스포츠 토토 베트맨len = 8;

    간격 = 1;
    스포츠 토토 베트맨da2-스포츠 토토 베트맨var[1].스포츠 토토 베트맨type = ECPGt_int;
    스포츠 토토 베트맨da2-스포츠 토토 베트맨var[1].스포츠 토토 베트맨data = (char *) &intval;
    스포츠 토토 베트맨da2-스포츠 토토 베트맨var[1].스포츠 토토 베트맨len = sizeof(intval);

    /* 입력 매개변수로 커서를 엽니다. */
    EXEC 스포츠 토토 베트맨 OPEN cur1 설명자를 사용하여 스포츠 토토 베트맨da2;

    동안 (1)

        스포츠 토토 베트맨da_t *cur_스포츠 토토 베트맨da;

        /* 커서에 설명자를 할당 */
        EXEC 스포츠 토토 베트맨은 cur1에서 설명자 스포츠 토토 베트맨da1로 다음 항목을 가져옵니다.

        (cur_스포츠 토토 베트맨da = 스포츠 토토 베트맨da1 ;
             cur_스포츠 토토 베트맨da != NULL ;
             cur_스포츠 토토 베트맨da = cur_스포츠 토토 베트맨da-desc_next)

            나는 int;
            문자 이름_buf[1024];
            char var_buf[1024];

            /* 행의 모든 ​​열을 인쇄합니다. */
            for (i=0 ; i<cur_스포츠 토토 베트맨da-스포츠 토토 베트맨d ; i++)

                스포츠 토토 베트맨var_t v = cur_스포츠 토토 베트맨da-스포츠 토토 베트맨var[i];
                char *스포츠 토토 베트맨data = v.스포츠 토토 베트맨data;
                짧은 스포츠 토토 베트맨len = v.스포츠 토토 베트맨len;

                strncpy(name_buf, v.스포츠 토토 베트맨name.data, v.스포츠 토토 베트맨name.length);
                name_buf[v.스포츠 토토 베트맨name.length] = '\0';

                스위치(v.스포츠 토토 베트맨type)

                    사례 ECPGt_char:
                        memset(&var_buf, 0, sizeof(var_buf));
                        memcpy(&var_buf, 스포츠 토토 베트맨data, (sizeof(var_buf)<=스포츠 토토 베트맨len ? sizeof(var_buf)-1 : 스포츠 토토 베트맨len) );
                        부서지다;

                    case ECPGt_int: /* 정수 */
                        memcpy(&intval, 스포츠 토토 베트맨data, 스포츠 토토 베트맨len);
                        snprintf(var_buf, sizeof(var_buf), "%d", intval);
                        부서지다;

                    케이스 ECPGt_long_long: /* bigint */
                        memcpy(&longval, 스포츠 토토 베트맨data, 스포츠 토토 베트맨len);
                        snprintf(var_buf, sizeof(var_buf), "%lld", longlongval);
                        부서지다;

                    기본값:

                        나는 int;
                        memset(var_buf, 0, sizeof(var_buf));
                        for (i = 0; i < 스포츠 토토 베트맨len; i++)

                            char tmpbuf[16];
                            snprintf(tmpbuf, sizeof(tmpbuf), "%02x ", (부호 없는 문자) 스포츠 토토 베트맨data[i]);
                            strncat(var_buf, tmpbuf, sizeof(var_buf));

                        부서지다;

                printf("%s = %s (유형: %d)\n", name_buf, var_buf, v.스포츠 토토 베트맨type);

            printf("\n");

    EXEC 스포츠 토토 베트맨 CLOSE cur1;
    EXEC 스포츠 토토 베트맨 커밋;

    EXEC 스포츠 토토 베트맨 모두 연결 해제;

    0을 반환합니다.

이 예의 출력은 다음과 유사해야 합니다. 다음과 같습니다(일부 숫자는 다를 수 있음).

oid = 1 (유형: 1)
datname = template1 (유형: 1)
datdba = 10 (유형: 1)
인코딩 = 0 (유형: 5)
datistemplate = t (유형: 1)
datallowconn = t (유형: 1)
datconnlimit = -1(유형: 5)
datlastsysoid = 11510 (유형: 1)
datfrozenxid = 379 (유형: 1)
dattablespace = 1663(유형: 1)
datconfig = (유형: 1)
datacl = =c/uptime,uptime=CTc/uptime (유형: 1)
datid = 1 (유형: 1)
datname = template1 (유형: 1)
백엔드 수 = 0(유형: 5)
xact_commit = 113606 (유형: 9)
xact_rollback = 0 (유형: 9)
blks_read = 130 (유형: 9)
blks_hit = 7341714 (유형: 9)
tup_returned = 38262679 (유형: 9)
tup_fetched = 1836281 (유형: 9)
tup_inserted = 0 (유형: 9)
tup_updated = 0 (유형: 9)
tup_deleted = 0 (유형: 9)

oid = 11511 (유형: 1)
datname = postgres(유형: 1)
datdba = 10 (유형: 1)
인코딩 = 0 (유형: 5)
datistemplate = f (유형: 1)
datallowconn = t (유형: 1)
datconnlimit = -1(유형: 5)
datlastsysoid = 11510 (유형: 1)
datfrozenxid = 379 (유형: 1)
dattablespace = 1663(유형: 1)
datconfig = (유형: 1)
datacl = (유형: 1)
datid = 11511 (유형: 1)
datname = postgres(유형: 1)
백엔드 수 = 0(유형: 5)
xact_commit = 221069 (유형: 9)
xact_rollback = 18 (유형: 9)
blks_read = 1176 (유형: 9)
blks_hit = 13943750 (유형: 9)
tup_returned = 77410091 (유형: 9)
tup_fetched = 3253694 (유형: 9)
tup_inserted = 0 (유형: 9)
tup_updated = 0 (유형: 9)
tup_deleted = 0 (유형: 9)