2025 년 7 월 17 일 : | Postgre윈 토토 18 베타 2 릴리스!
이 문서는 지원되지 않는 버전의 Postgre윈 토토을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다Postgre와이즈 윈 토토 : 문서 : 17 : 34.7. 설명자 영역 사용버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

34.7. 설명자 영역 사용#

윈 토토 디스크립터 영역은 A의 결과를 처리하는보다 정교한 방법입니다select, fetch또는 a설명진술. 윈 토토 디스크립터 영역은 메타 데이터 항목과 함께 한 행의 데이터 데이터를 하나의 데이터 구조로 그룹화합니다. 메타 데이터는 결과 열의 특성을 미리 알 수없는 동적 윈 토토 문을 실행할 때 특히 유용합니다. Postgre윈 토토은 디스크립터 영역을 사용하는 두 가지 방법을 제공합니다 : 명명 된 윈 토토 디스크립터 영역과 C- 구조 윈 토토DAS.

34.7.1. 이름이 지정된 윈 토토 디스크립터 영역#

이름 지정된 윈 토토 디스크립터 영역은 전체 설명자에 관한 정보와 하나 이상의 항목 디스크립터 영역을 포함하는 헤더로 구성되어 있으며, 기본적으로 각각 결과 행에서 하나의 열을 설명합니다..

윈 토토 디스크립터 영역을 사용하기 전에 하나를 할당해야합니다.

exec 윈 토토 할당 디스크립터식별자;

식별자는 역할을합니다.변수 이름설명 자 영역. 더 이상 디스크립터가 필요하지 않은 경우 다음을 처리해야합니다.

Exec 윈 토토 Dalloce Descriptor식별자;

디스크립터 영역을 사용하려면의 스토리지 대상으로 지정하십시오.in조항, 호스트 변수를 나열하는 대신 :

Exec 윈 토토 Fetch 다음에 MyCursor에서 윈 토토 디스크립터 MyDesc;

결과 세트가 비어 있으면 디스크립터 영역은 여전히 쿼리의 메타 데이터, 즉 필드 이름입니다..

아직 실행되지 않은 쿼리에 대해설명명령문은 결과 세트의 메타 데이터를 얻는 데 사용될 수 있습니다.

Exec 윈 토토 시작 선언 섹션;
char * sql_stmt = "select * from table1";
Exec 윈 토토 END DELLARE SECTION;

Exec 윈 토토 STMT1 준비 : 윈 토토_STMT;
Exec 윈 토토 STMT1을 윈 토토 디스크립터 MyDesc에 설명합니다.

postgresql 9.0 이전,윈 토토키워드는 선택 사항이므로 사용디스크립터and윈 토토 디스크립터명명 된 윈 토토 디스크립터 영역을 생산합니다. 이제 그것은 필수입니다.윈 토토키워드 생성 윈 토토DA 디스크립터 영역, 참조섹션 34.7.2.

in설명andFetch진술,inand사용키워드는 비슷하게 사용될 수 있습니다 : 디스크립터 영역에서 결과 세트와 메타 데이터를 생성합니다.

이제 디스크립터 영역에서 데이터를 어떻게 꺼내나요? 디스크립터 영역을 필드 명명 된 구조로 생각할 수 있습니다. 헤더에서 필드 값을 검색하고 호스트 변수에 저장하려면 다음 명령을 사용하십시오..

Exec 윈 토토 Get Destriptor이름 :hostvar=필드;

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

Exec 윈 토토 Get Destcriptor이름valueNum :hostvar=필드;

Num는 문자 그대로의 정수 또는 정수를 포함하는 호스트 변수 일 수 있습니다. 가능한 필드는 다음과 같습니다.

추기경(정수) #

결과 세트의 행 수

데이터 #

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

dateTime_interVal_code(정수) #

언제타입is9, dateTime_interVal_code값은입니다.1for날짜, 2forTime, 3for타임 스탬프, 4for시간대가있는 시간또는5for시간대가있는 타임 스탬프.

DateTime_interVal_Precision(정수) #

구현되지 않음

표시기(정수) #

표시기 (널 값 또는 값 자르기를 나타내는)

key_member(정수) #

구현되지 않음

길이(정수) #

캐릭터의 데이텀 길이

이름(String) #

열 이름

nullable(정수) #

구현되지 않음

Octet_length(정수) #

바이트에서 데이텀의 문자 표현 길이

정밀(정수) #

정밀도 (유형숫자)

returned_length(정수) #

캐릭터의 데이텀 길이

returned_octet_length(정수) #

바이트에서 데이텀의 문자 표현 길이

스케일(정수) #

스케일 (유형숫자)

Type(정수) #

열의 데이터 유형의 숫자 코드

inexecute, 선언andOpen진술,의 효과inand사용키워드가 다릅니다. 디스크립터 영역은 쿼리 또는 커서의 입력 매개 변수를 제공하기 위해 수동으로 제작할 수 있습니다.윈 토토 디스크립터 사용이름입력 매개 변수를 매개 변수화 쿼리로 전달하는 방법입니다. 이름이 지정된 윈 토토 디스크립터 영역을 구축하려는 진술은 다음과 같습니다.

Exec 윈 토토 Set Descriptor이름valueNum 필드= :hostvar;

Postgre윈 토토은 하나의 레코드를 하나씩 검색하는 것을 지원합니다fetch명령문 및이 경우 호스트 변수에 데이터를 저장하면 변수가 배열이라고 가정합니다. 예 :

Exec 윈 토토 시작 선언 섹션;
int id [5];
Exec 윈 토토 END DELLARE SECTION;

Exec 윈 토토 Fetch 5 MyCursor에서 윈 토토 디스크립터 MyDesc로 향합니다.

Exec 윈 토토 GET DESCRICTOR MYDESC 값 1 : ID = DATA;

34.7.2. 윈 토토DA 디스크립터 영역#

윈 토토DA 디스크립터 영역은 쿼리의 결과 세트와 메타 데이터를 얻는 데 사용할 수있는 C 언어 구조입니다. 하나의 구조는 결과 세트에서 한 레코드를 저장합니다.

exec sql 포함 sqlda.h;
sqlda_t *mysqlda;

MyCursor에서 디스크립터 My윈 토토DA로의 Exec 윈 토토 Fetch 3;

윈 토토키워드가 생략되었습니다. 의 사용 사례에 대한 단락in사용키워드섹션 34.7.1추가로 여기에 적용하십시오. 에서설명진술디스크립터키워드를 완전히 생략 할 수 있습니다in키워드가 사용됩니다 :

exec 윈 토토 repection_statement indeqlda;

윈 토토DA를 사용하는 프로그램의 일반적인 흐름은 다음과 같습니다.

  1. 쿼리 준비를하고 커서를 선언합니다.

  2. 결과 행에 대한 윈 토토DA를 선언합니다.

  3. 입력 매개 변수에 대한 윈 토토DA를 선언하고 초기화 (메모리 할당, 매개 변수 설정)..

  4. 입력 윈 토토DA로 커서를 엽니 다.

  5. 커서에서 행을 가져 와서 출력 윈 토토DA에 저장합니다.

  6. 출력 윈 토토DA에서 호스트 변수로 값을 읽습니다 (필요한 경우 변환)

  7. 커서를 닫습니다.

  8. 입력 윈 토토DA에 할당 된 메모리 영역을 제거합니다.

34.7.2.1. 윈 토토DA 데이터 구조#

윈 토토DA는 세 가지 데이터 구조 유형을 사용합니다.윈 토토DA_T, 윈 토토VAR_Tstruct 윈 토토name.

Postgre윈 토토의 윈 토토DA는 IBM DB2 범용 데이터베이스와 유사한 데이터 구조를 가지고 있으므로 DB2의 윈 토토DA에 대한 일부 기술 정보는 Postgre윈 토토의 더 나은 이해에 도움이 될 수 있습니다..

34.7.2.1.1. 윈 토토DA_T 구조#

구조 유형윈 토토DA_T는 실제 윈 토토DA의 유형입니다. 하나의 레코드를 보유하고 있습니다. 그리고 둘 이상의윈 토토DA_T구조는 링크 된 목록에 포인터와 연결된 목록에 연결할 수 있습니다desc_next필드, 따라서 순서대로 행하는 행을 나타냅니다. 따라서 두 개 이상의 행을 가져 오면 응용 프로그램은를 따라 읽을 수 있습니다.desc_next각각의 포인터윈 토토DA_T노드.

정의윈 토토DA_TIS :

struct sqlda_struct

    char sqldaid [8];
    긴 sqldabc;
    짧은 sqln;
    짧은 윈 토토D;
    struct sqlda_struct *desc_next;
    struct 윈 토토var_struct 윈 토토var [1];
;

typedef struct sqlda_struct sqlda_t;

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

윈 토토DAID #

문자 그대로 문자열이 포함되어 있습니다"윈 토토DA".

윈 토토DABC #

할당 된 공간의 크기가 바이트의 크기를 포함합니다.

윈 토토N #

전달 된 경우 매개 변수화 된 쿼리의 입력 매개 변수 수가 포함되어 있습니다.Open, 선언또는execute사용키워드. 의 출력으로 사용되는 경우select, execute또는fetch진술, 그 값은와 동일합니다윈 토토D성명서

윈 토토D #

결과 세트에 필드 수가 포함되어 있습니다.

desc_next #

쿼리가 둘 이상의 레코드를 반환하면 여러 개의 연결된 윈 토토DA 구조가 반환되고desc_next목록의 다음 항목에 대한 포인터를 보유합니다.

윈 토토VAR #

결과 세트의 열의 배열입니다.

34.7.2.1.2. 윈 토토var_t 구조#

구조 유형윈 토토VAR_T유형 및 길이와 같은 열 값과 메타 데이터를 보유합니다. 유형의 정의는 다음과 같습니다.

struct 윈 토토var_struct

    짧은 sqltype;
    짧은 sqllen;
    char *sqldata;
    짧은 *sqlind;
    struct 윈 토토name 윈 토토name;
;

typedef struct 윈 토토var_struct 윈 토토var_t;

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

윈 토토TYPE #

필드의 유형 식별자를 포함합니다. 값은 참조enum ecpgttypeinecpgtype.h.

윈 토토len #

필드의 이진 길이를 포함합니다. 예를 들어, 4 바이트ecpgt_int.

윈 토토DATA #

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

sqlind #

널 표시기를 가리 킵니다. 0은 null을 의미하지 않으며 -1은 null을 의미합니다.

윈 토토name #

필드의 이름.

34.7.2.1.3. struct 윈 토토name 구조#

astruct 윈 토토name구조는 열 이름을 보유합니다. 그것은의 멤버로 사용됩니다.윈 토토var_t구조. 구조의 정의는 다음과 같습니다.

#Define NamedAtalen 64

struct 윈 토토name

        짧은 길이;
        char 데이터 [이름 지정];
;

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

길이 #

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

데이터 #

실제 필드 이름을 포함합니다.

34.7.2.2. 윈 토토DA를 사용하여 결과 세트 검색#

윈 토토DA를 통해 설정된 쿼리 결과를 검색하는 일반 단계는 다음과 같습니다.

  1. 선언윈 토토DA_T결과 세트를 수신 할 구조.

  2. executefetch/execute/설명선언 된 윈 토토DA를 지정하는 쿼리를 처리하는 명령.

  3. 살펴보기로 설정된 결과의 레코드 수 확인윈 토토N, 회원윈 토토DA_T구조.

  4. 각 열의 값을 얻으십시오윈 토토VAR [0], 윈 토토VAR [1]등,윈 토토DA_T구조.

  5. 다음 행으로 이동 (윈 토토DA_T구조) 다음에 따른desc_next포인터,윈 토토DA_T구조.

  6. 필요한대로 위에서 반복하십시오.

윈 토토DA를 통해 세트를 검색하는 예입니다.

먼저, a 선언윈 토토DA_T결과 세트를 수신 할 구조.

윈 토토DA_T *윈 토토DA1;

다음, 명령에 윈 토토DA를 지정하십시오. 이것은입니다.Fetch명령 예.

exec 윈 토토 exect sql exect cur1에서 디스크립터 sqlda1;

링크 된 목록을 따라 루프를 실행하여 행을 검색합니다.

sqlda_t *cur_sqlda;

for (cur_sqlda = sqlda1;
     cur_sqlda! = null;
     cur_sqlda = cur_sqlda- desc_next)

    ...

루프 내부에서 다른 루프를 실행하여 각 열 데이터를 검색합니다 (윈 토토var_t구조) 행의 구조.

for (i = 0; i <cur_sqlda- sqld; i ++)

    윈 토토var_t v = cur_sqlda- 윈 토토var [i];
    char *sqldata = v.sqldata;
    짧은 sqllen = v.sqllen;
    ...

열 값을 얻으려면를 확인하십시오.윈 토토TYPE값,윈 토토VAR_T구조. 그런 다음 열 유형에 따라 적절한 방법으로 전환하여에서 데이터를 복사하십시오.윈 토토VAR호스트 변수에 필드

char var_buf [1024];

스위치 (v.윈 토토type)

    CASE ECPGT_CHAR :
        memset (& var_buf, 0, sizeof (var_buf));
        memcpy (& var_buf, sqldata, (sizeof (var_buf) <= sqllen? sizeof (var_buf) -1 : sqllen));
        부서지다;

    case ecpgt_int : / * 정수 * /
        memcpy (& intval, sqldata, sqllen);
        snprintf (var_buf, sizeof (var_buf), "%d", intval);
        부서지다;

    ...

34.7.2.3. 윈 토토DA를 사용하여 쿼리 매개 변수 전달#

윈 토토DA를 사용하여 입력 매개 변수를 준비된 쿼리로 전달하는 일반 단계는 다음과 같습니다.

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

  2. 윈 토토DA_T 구조를 입력 윈 토토DA로 선언합니다.

  3. 입력 윈 토토DA에 대한 메모리 영역 (윈 토토DA_T 구조) 할당.

  4. 할당 된 메모리의 입력 값을 설정 (복사).

  5. 입력 윈 토토DA를 지정하여 커서를 엽니 다.

여기 예입니다.

먼저 준비된 진술을 만듭니다.

Exec 윈 토토 시작 선언 섹션;
char query [1024] = "pg_database d, pg_stat_database s에서 d.oid = s.datid 및 (d.datname =? 또는 d.oid =?)";
Exec 윈 토토 END DELLARE SECTION;

EXEC 윈 토토 STMT1 준비 : 쿼리;

다음, 윈 토토DA에 대한 메모리를 할당하고 입력 매개 변수 수를 설정합니다윈 토토N,의 멤버 변수윈 토토DA_T구조. 준비된 쿼리에 둘 이상의 입력 매개 변수가 필요한 경우, 응용 프로그램은 (nr. of params -1) * sizeof (윈 토토var_t)에 의해 계산되는 추가 메모리 공간을 할당해야합니다. 여기에 표시된 예제는 두 개의 입력 매개 변수에 대한 메모리 공간을 할당합니다.

윈 토토DA_T *윈 토토DA2;

sqlda2 = (sqlda_t *) malloc (sizeof (sqlda_t) + sizeof (윈 토토var_t));
memset (sqlda2, 0, sizeof (sqlda_t) + sizeof (윈 토토var_t));

sqlda2- sqln = 2; / * 입력 변수 수 */

메모리 할당 후 매개 변수 값을에 저장하십시오.윈 토토var []배열. (이것은 윈 토토DA가 결과 세트를 수신 할 때 열 값을 검색하는 데 사용되는 것과 동일합니다.)이 예에서는 입력 매개 변수가입니다."Postgres", 문자열 유형이 있고1, 정수 유형이 있습니다.

sqlda2- 윈 토토var [0] .sqltype = ecpgt_char;
sqlda2- 윈 토토var [0] .sqldata = "postgres";
sqlda2- 윈 토토var [0] .sqllen = 8;

int intval = 1;
sqlda2- 윈 토토var [1] .sqltype = ecpgt_int;
sqlda2- 윈 토토var [1] .sqldata = (char *) & intval;
sqlda2- 윈 토토var [1] .sqllen = sizeof (intval);

커서를 열고 미리 설정된 윈 토토DA를 지정하여 입력 매개 변수가 준비된 명령문으로 전달됩니다..

exec sql descriptor sqlda2를 사용하여 CUR1 OPEN CUR1;

마지막으로, 입력 윈 토토DA를 사용한 후에 할당 된 메모리 공간은 쿼리 결과를 수신하는 데 사용되는 윈 토토DA와 달리 명시 적으로 자유롭게 해제되어야합니다..

free (윈 토토da2);

34.7.2.4. 윈 토토DA를 사용한 샘플 응용 프로그램#

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

이 응용 프로그램은 데이터베이스 OID의 PG_DATABASE 및 PG_STAT_DATABASE의 두 시스템 테이블에 합류하며 두 입력 매개 변수 (데이터베이스에 의해 검색되는 데이터베이스 통계를 가져오고 표시합니다.Postgres및 OID1).

먼저 입력에 대한 윈 토토DA를 선언하고 출력을위한 윈 토토DA를 선언합니다.

exec sql 포함 sqlda.h;

sqlda_t *sqlda1; / * 출력 설명 자 */
sqlda_t *sqlda2; / * 입력 설명 자 */

다음으로, 다음, 데이터베이스에 연결하고, 진술을 준비하고, 준비된 진술에 대한 커서를 선언합니다.

int
메인 (void)

    Exec 윈 토토 시작 선언 섹션;
    char query [1024] = "pg_database d, pg_stat_database s에서 d.oid = s.datid 및 (d.datname =? 또는 d.oid =?)";
    Exec 윈 토토 END DELLARE SECTION;

    EXEC 윈 토토 TestDB에 CON1 사용자 테스트를 사용합니다.
    Exec 윈 토토 선택 PG_CATALOG.SET_CONFIG ( 'search_Path', '', False); Exec 윈 토토 커밋;

    Exec 윈 토토 STMT1 준비 : 쿼리;
    EXEC 윈 토토 STMT1에 대한 CUR1 커서 선언;

다음, 입력 매개 변수에 대한 입력 윈 토토DA에 값을 넣으십시오. 입력 윈 토토DA에 대한 메모리를 할당하고 입력 매개 변수 수를로 설정하십시오.윈 토토N. 상점 유형, 값 및 가치 길이로윈 토토TYPE, 윈 토토DATA윈 토토lenin윈 토토var구조.

/* 입력 매개 변수에 대한 윈 토토DA 구조를 만듭니다. */
    sqlda2 = (sqlda_t *) malloc (sizeof (sqlda_t) + sizeof (윈 토토var_t));
    memset (sqlda2, 0, sizeof (sqlda_t) + sizeof (윈 토토var_t));
    sqlda2- sqln = 2; / * 입력 변수 수 */

    sqlda2- 윈 토토var [0] .sqltype = ecpgt_char;
    sqlda2- 윈 토토var [0] .sqldata = "postgres";
    sqlda2- 윈 토토var [0] .sqllen = 8;

    intval = 1;
    sqlda2- 윈 토토var [1] .sqltype = ecpgt_int;
    sqlda2- 윈 토토var [1] .sqldata = (char *) & intval;
    sqlda2- 윈 토토var [1] .sqllen = sizeof (intval);

입력 윈 토토DA를 설정 한 후 입력 윈 토토DA로 커서를 엽니 다.

/* 입력 매개 변수가있는 커서를 엽니 다. */
    디스크립터 sqlda2;를 사용하여 Exec 윈 토토 Open CUR1

열린 커서에서 출력 윈 토토DA로 행을 가져옵니다. (일반적으로 전화해야Fetch루프에서 반복적으로 결과 세트에서 모든 행을 가져 오려면)

while (1)

        sqlda_t *cur_sqlda;

        / * 디스크립터 할당 커서 */
        exec 윈 토토이 CUR1에서 디스크립터 윈 토토DA1로 가져옵니다.

다음, 링크 된 링크 목록을 따라 윈 토토DA에서 가져온 레코드를 검색합니다윈 토토DA_T구조.

for (cur_sqlda = sqlda1;
         cur_sqlda! = null;
         cur_sqlda = cur_sqlda- desc_next)

        ...

첫 번째 레코드에서 각 열을 읽으십시오. 열 수는에 저장됩니다.윈 토토D, 첫 번째 열의 실제 데이터는에 저장됩니다.윈 토토VAR [0], 두 멤버윈 토토DA_T구조.

/* 모든 열을 연속으로 인쇄하십시오. */
        for (i = 0; i <sqlda1- sqld; i ++)

            윈 토토var_t v = sqlda1- 윈 토토var [i];
            char *sqldata = v.sqldata;
            짧은 sqllen = v.sqllen;

            strncpy (name_buf, v.윈 토토name.data, v.윈 토토name.length);
            name_buf [v.윈 토토name.length] = '\ 0';

이제 열 데이터가 변수에 저장됩니다V. 모든 데이텀을 호스트 변수로 복사하여v.윈 토토type열의 유형의 경우

스위치 (v.윈 토토type) 
                int intval;
                더블 볼;
                서명되지 않은 긴 긴 int longlongval;

                CASE ECPGT_CHAR :
                    memset (& var_buf, 0, sizeof (var_buf));
                    memcpy (& var_buf, sqldata, (sizeof (var_buf) <= sqllen? sizeof (var_buf) -1 : sqllen));
                    부서지다;

                case ecpgt_int : / * 정수 * /
                    memcpy (& intval, sqldata, sqllen);
                    snprintf (var_buf, sizeof (var_buf), "%d", intval);
                    부서지다;

                ...

                기본:
                    ...

            printf ( " %s = %s (유형 : %d) \ n", name_buf, var_buf, v.윈 토토type);

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

Exec 윈 토토 COR1;
    Exec 윈 토토 커밋;

    EXEC 윈 토토 모든 분리;

전체 프로그램이에 표시됩니다.예 34.1.

예 34.1. 예제 윈 토토DA 프로그램

#include <stdlib.h
#include <string.h
#include <stdlib.h
#include <stdio.h
#include <unistd.h

exec sql은 sqlda.h;

sqlda_t *sqlda1; / * 출력에 대한 설명자 */
sqlda_t *sqlda2; / * 입력에 대한 설명자 */

찾을 수 없을 때마다 Exec 윈 토토이 중단됩니다.
윈 토토ERROR가 중지 될 때마다 윈 토토 EXEC;

int
메인 (void)

    Exec 윈 토토 시작 선언 섹션;
    char query [1024] = "pg_database d, pg_stat_database s에서 d.oid = s.datid 및 (d.datname =? 또는 d.oid =?)";

    int intval;
    서명되지 않은 긴 긴 int longlongval;
    Exec 윈 토토 END DELLARE SECTION;

    EXEC 윈 토토 CON1 사용자 가동 시간으로 UptimedB에 연결합니다.
    Exec 윈 토토 선택 PG_CATALOG.SET_CONFIG ( 'search_Path', '', False); Exec 윈 토토 커밋;

    Exec 윈 토토 STMT1 준비 : 쿼리;
    STMT1에 대한 EXEC 윈 토토 선언 CUR1 커서;

    / * 입력 매개 변수에 대한 윈 토토DA 구조 생성 */
    sqlda2 = (sqlda_t *) malloc (sizeof (sqlda_t) + sizeof (윈 토토var_t));
    memset (sqlda2, 0, sizeof (sqlda_t) + sizeof (윈 토토var_t));
    sqlda2- sqln = 2; / * 여러 입력 변수 */

    sqlda2- 윈 토토var [0] .sqltype = ecpgt_char;
    sqlda2- 윈 토토var [0] .sqldata = "postgres";
    sqlda2- 윈 토토var [0] .sqllen = 8;

    intval = 1;
    sqlda2- 윈 토토var [1] .sqltype = ecpgt_int;
    sqlda2- 윈 토토var [1] .sqldata = (char *) & intval;
    sqlda2- 윈 토토var [1] .sqllen = sizeof (intval);

    /* 입력 매개 변수가있는 커서를 엽니 다. */
    디스크립터 윈 토토DA2를 사용하여 EXEC 윈 토토 OPEN CUR1;

    동안 (1)

        sqlda_t *cur_sqlda;

        / * 디스크립터 할당 커서 */
        exec 윈 토토은 다음에 cur1에서 디스크립터 sqlda1로 가져옵니다.

        for (cur_sqlda = sqlda1;
             cur_sqlda! = null;
             cur_sqlda = cur_sqlda- desc_next)

            int i;
            char name_buf [1024];
            char var_buf [1024];

            /* 모든 열을 연속으로 인쇄합니다. */
            for (i = 0; i <cur_sqlda- sqld; i ++)

                윈 토토var_t v = cur_sqlda- 윈 토토var [i];
                char *sqldata = v.sqldata;
                짧은 sqllen = v.sqllen;

                strncpy (name_buf, v.윈 토토name.data, v.윈 토토name.length);
                name_buf [v.윈 토토name.length] = '\ 0';

                스위치 (v.윈 토토type)

                    CASE ECPGT_CHAR :
                        memset (& var_buf, 0, sizeof (var_buf));
                        memcpy (& var_buf, sqldata, (sizeof (var_buf) <= sqllen? sizeof (var_buf) -1 : sqllen));
                        부서지다;

                    case ecpgt_int : / * 정수 * /
                        memcpy (& intval, sqldata, sqllen);
                        snprintf (var_buf, sizeof (var_buf), "%d", intval);
                        부서지다;

                    CASE ECPGT_LONG_LONG : / * BIGINT * /
                        memcpy (& longlongval, sqldata, sqllen);
                        snprintf (var_buf, sizeof (var_buf), "%lld", longlongval);
                        부서지다;

                    기본:

                        int i;
                        memset (var_buf, 0, sizeof (var_buf));
                        for (i = 0; i <sqllen; i ++)

                            char tmpbuf [16];
                            snprintf (tmpbuf, sizeof (tmpbuf), "%02x", (서명 된 char) sqldata [i]);
                            strncat (var_buf, tmpbuf, sizeof (var_buf));

                        부서지다;

                printf ( " %s = %s (유형 : %d) \ n", name_buf, var_buf, v.윈 토토type);

            printf ( "\ n");

    Exec 윈 토토 COR1;
    Exec 윈 토토 커밋;

    Exec 윈 토토 모든 분리;

    반환 0;

이 예제의 출력은 다음과 같은 것으로 보일 것입니다 (일부 숫자는 다릅니다).

OID = 1 (유형 : 1)
datname = template1 (유형 : 1)
datdba = 10 (유형 : 1)
인코딩 = 0 (유형 : 5)
datistemplate = t (유형 : 1)
datallowconn = t (유형 : 1)
dathasloginevt = f (유형 : 1)
datconnlimit = -1 (유형 : 5)
datfrozenxid = 379 (유형 : 1)
dattablespace = 1663 (유형 : 1)
datconfig = (유형 : 1)
dataCl = = c/Upime, Uptime = CTC/Uptime (유형 : 1)
datid = 1 (유형 : 1)
datname = template1 (유형 : 1)
Numbackends = 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)
dathasloginevt = f (유형 : 1)
datconnlimit = -1 (유형 : 5)
datfrozenxid = 379 (유형 : 1)
dattablespace = 1663 (유형 : 1)
datconfig = (유형 : 1)
dataCl = (유형 : 1)
datid = 11511 (유형 : 1)
datname = postgres (유형 : 1)
Numbackends = 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)