이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다Postgre와이즈 토토 : 문서 : 17 : 34.7. 설명자 영역 사용버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

33.7. 설명자 영역 토토

SQL 디스크립터 영역은보다 정교한 방법입니다. a의 결과 처리​​select, fetch또는 A설명진술. SQL 디스크립터 영역 그룹 메타 데이터 항목과 함께 한 줄의 데이터 데이터를 하나로 데이터 구조. 메타 데이터는 특히 유용합니다 결과의 특성이있는 동적 SQL 문장 실행 열은 미리 알려지지 않을 수 있습니다. PostgreSQL은 두 가지를 제공합니다 설명자 영역을 토토하는 방법 : 명명 된 SQL 디스크립터 영역 및 c- 구조 sqldas.

33.7.1. SQL 디스크립터로 명명되었습니다 영역

이름 지정된 SQL 디스크립터 영역은 헤더로 구성됩니다. 전체 설명자에 관한 정보와 하나에 대한 정보가 포함되어 있습니다 또는 기본적으로 각각 설명하는 항목 설명자 영역 결과 행의 한 열.

SQL 디스크립터 영역을 토토하기 전에 하나를 할당하십시오 :

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

식별자는 역할을합니다."변수 이름"설명 자 영역. 필요하지 않을 때 더 이상 설명자, 당신은 그것을 거래해야합니다 :

Exec SQL Dalloce Descriptor식별자;

디스크립터 영역을 토토하려면 스토리지 대상으로 지정하십시오. 에서in목록 대신 조항 호스트 변수 :

exec SQL Fetch 다음에 MyCursor에서 SQL 디스크립터 MyDesc;

결과 세트가 비어 있으면 서술자 영역이 여전히 쿼리에서 메타 데이터를 포함하십시오, 즉 필드 이름.

아직 실행되지 않은 준비된 쿼리,설명명령문을 토토하는 데 토토될 수 있습니다 결과 세트의 메타 데이터 :

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

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

postgresql 9.0 이전,SQL키워드는 선택 사항이므로 토토디스크립터SQL 설명자명명 된 SQL 디스크립터 영역을 생산합니다. 이제 필수, 생략SQL키워드 SQLDA 디스크립터 영역을 생성하고 참조섹션 33.7.2.

in설명andFetch진술,in토토키워드 비슷하게 토토될 수 있습니다. 결과 세트와 설명 자 영역의 메타 데이터.

이제 디스크립터 영역에서 데이터를 어떻게 얻습니까? 너 설명자 영역을 명명 된 구조로 생각할 수 있습니다. 전지. 헤더에서 필드 값을 검색하려면 호스트 변수로 저장하고 다음 명령을 토토하십시오.

Exec SQL GET DESCRICTOR이름 :hostvar=필드;

현재, 헤더 필드는 하나뿐입니다.count항목 설명자 영역이 존재합니다 (즉, 몇 개의 열이 결과에 포함). 호스트 변수는 an이어야합니다 정수 유형. 항목 설명 자 영역에서 필드를 얻으려면 토토하십시오. 다음 명령 :

Exec SQL GET DESCRICTOR이름valueNum :hostvar=필드;

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

추기경(정수)

결과 세트의 행 수

데이터

실제 데이터 항목 (따라서 데이터 유형입니다 필드는 쿼리에 따라 다릅니다)

dateTime_interVal_code(정수)

언제Typeis9, dateTime_interVal_code값이 있습니다 의1for날짜, 2forTime, 3for타임 스탬프, 4for시간이 지남에 따라 시간 존또는5for시간대가있는 타임 스탬프.

DateTime_interVal_Precision(정수)

구현되지 않음

표시기(정수)

표시기 (널 값 또는 값을 나타냅니다 잘림)

key_member(정수)

구현되지 않음

길이(정수)

캐릭터의 데이텀 길이

이름(String)

열의 이름

nullable(정수)

구현되지 않음

Octet_length(정수)

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

정밀(정수)

정밀도 (유형숫자)

returned_length(정수)

캐릭터의 데이텀 길이

returned_octet_length(정수)

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

스케일(정수)

스케일 (유형숫자)

타입(정수)

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

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

exec SQL 세트 디스크립터이름valueNum 필드= :hostvar;

PostgreSQL은 하나의 레코드를 하나씩 검색하는 것을 지원합니다Fetch문 및 데이터 저장 이 경우 호스트 변수에서 변수가 정렬. 예 :

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

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

Exec SQL GET DESCRICTOR MYDESC 값 1 : ID = DATA;

33.7.2. SQLDA 디스크립터 영역

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

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

MyCursor에서 디스크립터 MySQLDA로의 Exec SQL Fetch 3;

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

exec SQL repection_statement indeqlda;

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

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

  2. 결과 행에 대한 SQLDA를 선언합니다.

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

  4. 입력 SQLDA로 커서를 엽니 다.

  5. 커서에서 행을 가져와 출력 sqlda.

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

  7. 커서를 닫습니다.

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

33.7.2.1. SQLDA 데이터 구조

SQLDA는 세 가지 데이터 구조 유형을 토토합니다.SQLDA_T, SQLVAR_Tstruct sqlname.

팁 :PostgreSQL의 SQLDA에는 비슷한 데이터가 있습니다 IBM DB2 범용 데이터베이스의 구조 DB2의 SQLDA에 대한 일부 기술 정보가 도움이 될 수 있습니다 PostgreSQL이 더 나은 이해.

33.7.2.1.1. SQLDA_T 구조

구조 유형SQLDA_T입니다 실제 SQLDA의 유형. 하나의 레코드를 보유하고 있습니다. 그리고 둘 또는 더SQLDA_T구조가 될 수 있습니다 의 포인터와 링크 된 목록에 연결desc_next필드 정렬 된 행 모음을 나타냅니다. 그래서, 둘 또는 더 많은 행을 가져 오면 응용 프로그램은 다음으로 읽을 수 있습니다. 다음desc_next각각의 포인터SQLDA_T노드.

의 정의SQLDA_TIS :

struct sqlda_struct

    char sqldaid [8];
    긴 sqldabc;
    짧은 sqln;
    짧은 SQLD;
    struct sqlda_struct *desc_next;
    struct sqlvar_struct sqlvar [1];
;

typedef struct sqlda_struct sqlda_t;

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

SQLDAID

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

SQLDABC

할당 된 공간의 크기가 포함되어 있습니다 바이트.

SQLN

a PARAMETRIZED 쿼리가 전달 된 경우Open, 선언또는execute토토키워드. 경우에 출력으로 토토select, execute또는fetch진술, 그 가치는입니다 동일SQLD진술

SQLD

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

desc_next

쿼리가 둘 이상의 레코드를 반환하면 다중 연결된 SQLDA 구조가 반환되고desc_next포인터를 보유합니다 목록의 다음 항목.

sqlvar

​​이것은 결과의 열의 배열입니다. 세트.

33.7.2.1.2. sqlvar_t 구조

구조 유형SQLVAR_Tholds 유형 및 길이와 같은 열 값 및 메타 데이터. 그만큼 유형의 정의는 다음과 같습니다.

struct sqlvar_struct

    짧은 sqltype;
    짧은 sqllen;
    char *sqldata;
    짧은 *sqlind;
    struct sqlname sqlname;
;

typedef struct sqlvar_struct sqlvar_t;

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

SQLTYPE

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

Sqllen

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

sqldata

데이터를 가리 킵니다. 데이터 형식은 다음과 같습니다 설명섹션 33.4.4.

sqlind

널 표시기를 가리 킵니다. 0은 NULL이 아닌 것을 의미합니다. -1 NULL을 의미합니다.

sqlname

필드의 이름.

33.7.2.1.3. struct sqlname 구조

astruct sqlname구조는 a 열 이름. 그것은의 멤버로 토토됩니다.SQLVAR_T구조. 의 정의 구조는 다음과 같습니다.

#Define NamedAtalen 64

struct sqlname

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

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

길이

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

데이터

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

33.7.2.2. 토토 결과 세트를 검색합니다 SQLDA

쿼리 결과를 검색하는 일반 단계 sqlda는 다음과 같습니다.

  1. 선언SQLDA_T구조 결과 세트를 받으려면.

  2. executefetch/execute/설명쿼리를 처리하도록 명령합니다 선언 된 sqlda 지정

  3. 설정 한 결과의 레코드 수 확인 보고있는sqln, 회원 의SQLDA_T구조.

  4. 각 열의 값을 얻으십시오sqlvar [0], SQLVAR [1]등,SQLDA_T구조.

  5. 다음 행으로 이동 (SQLDA_T구조) 다음을 따름desc_next포인터,SQLDA_T구조.

  6. 필요한대로 위의 반복.

다음은 다음과 같은 결과를 검색하는 예입니다. sqlda.

먼저, a 선언SQLDA_T구조 결과 세트를 받으려면.

SQLDA_T *SQLDA1;

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

exec SQL 다음은 CUR1에서 디스크립터 SQLDA1로 가져옵니다.

링크 된 목록을 따라 루프를 실행하여 줄.

sqlda_t *cur_sqlda;

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

    ...

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

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

    sqlvar_t v = cur_sqlda- sqlvar [i];
    char *sqldata = v.sqldata;
    짧은 sqllen = v.sqllen;
    ...

열 값을 얻으려면를 확인하십시오.sqltypevalue,sqlvar_t구조. 그런 다음 전환하십시오 열 유형에 따라 데이터를 복사하는 적절한 방법 에서sqlvar호스트에 필드 변하기 쉬운.

char var_buf [1024];

스위치 (v.sqltype)

    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);
        부서지다;

    ...

33.7.2.3. 토토한 쿼리 매개 변수를 전달합니다 SQLDA

SQLDA를 토토하여 입력을 전달하는 일반 단계 준비된 쿼리에 대한 매개 변수는 다음과 같습니다.

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

  2. SQLDA_T 구조를 입력 SQLDA로 선언합니다.

  3. 메모리 영역 (SQLDA_T 구조)을 할당합니다 입력 sqlda.

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

  5. 입력 SQLDA를 지정하여 커서를 엽니 다.

여기 예입니다.

먼저 준비된 진술을 만드십시오.

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

EXEC SQL STMT1 준비 : 쿼리;

다음, SQLDA에 메모리를 할당하고 수를 설정합니다. 입력 매개 변수SQLN, a 의 회원 변수SQLDA_T구조. 둘 이상의 입력 매개 변수가 필요한 경우 준비된 쿼리, 응용 프로그램은 할당해야합니다 (nr. of params에 의해 계산되는 추가 메모리 공간 -1) * sizeof (sqlvar_t). 여기에 표시된 예는 할당됩니다 두 개의 입력 매개 변수에 대한 메모리 공간.

sqlda_t *sqlda2;

sqlda2 = (sqlda_t *) malloc (sizeof (sqlda_t) + sizeof (sqlvar_t));
memset (sqlda2, 0, sizeof (sqlda_t) + sizeof (sqlvar_t));

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

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

sqlda2- sqlvar [0] .sqltype = ecpgt_char;
sqlda2- sqlvar [0] .sqldata = "postgres";
sqlda2- sqlvar [0] .sqllen = 8;

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

커서를 열고 설정된 SQLDA를 지정하여 사전에 입력 매개 변수가 전달됩니다 준비된 진술.

exec sql descriptor sqlda2를 토토하여 CUR1 OPEN CUR1;

마지막으로, 입력 sqldas를 토토한 후 할당 된 메모리 공간은 토토 된 SQLDA와 달리 명시 적으로 자유롭게 해제해야합니다 쿼리 결과 수신.

free (sqlda2);

33.7.2.4. 토토한 샘플 응용 프로그램 SQLDA

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

이 응용 프로그램은 두 시스템 테이블 인 PG_DATABASE에 가입합니다 데이터베이스 OID의 PG_STAT_DATABASE 및도 가져옵니다 데이터베이스 통계를 2 씩 검색합니다 입력 매개 변수 (데이터베이스Postgres및 OID1).

먼저 입력에 대한 SQLDA를 선언하고 SQLDA 산출.

exec sql 포함 sqlda.h;

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

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

int
메인 (void)

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

    EXEC SQL TestDB에 CON1 토토자 테스트를 토토합니다.

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

다음, 입력에 대한 입력 SQLDA에 값을 넣으십시오. 매개 변수. 입력 SQLDA에 메모리를 할당하고 설정하십시오 입력 매개 변수 수SQLN. 상점 유형, 값 및 가치 길이로sqltype, SQLDATASqlleninSQLVAR구조.

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

    sqlda2- sqlvar [0] .sqltype = ecpgt_char;
    sqlda2- sqlvar [0] .sqldata = "postgres";
    sqlda2- sqlvar [0] .sqllen = 8;

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

입력 SQLDA를 설정 한 후 커서를 엽니 다. 입력 sqlda.

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

열린 커서에서 출력 SQLDA로 행을 가져옵니다. (일반적으로 전화해야fetch루프에서 반복적으로 결과에서 모든 행을 가져 오기 위해 세트.)

while (1)

        sqlda_t *cur_sqlda;

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

다음, SQLDA에서 가져온 레코드를 검색하십시오 링크 된 목록에 따라SQLDA_T구조.

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

        ...

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

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

            sqlvar_t v = sqlda1- sqlvar [i];
            char *sqldata = v.sqldata;
            짧은 sqllen = v.sqllen;

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

이제 열 데이터가 변수에 저장됩니다V. 모든 데이텀을 호스트 변수로 복사하고 보고있는v.sqltype유형의 경우 열.

스위치 (v.sqltype) 
                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.sqltype);

모든 레코드를 처리 한 후 커서를 닫습니다 데이터베이스에서 분리.

Exec SQL COR1;
    Exec SQL 커밋;

    EXEC SQL 모든 분리;

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

예 33-1. 예제 SQLDA 프로그램

#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 SQL이 중단됩니다.
SQLERROR가 중지 될 때마다 SQL EXEC;

int
메인 (void)

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

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

    EXEC SQL CON1 토토자 가동 시간으로 UptimedB에 연결합니다.

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

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

    sqlda2- sqlvar [0] .sqltype = ecpgt_char;
    sqlda2- sqlvar [0] .sqldata = "postgres";
    sqlda2- sqlvar [0] .sqllen = 8;

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

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

    동안 (1)

        sqlda_t *cur_sqlda;

        / * 디스크립터 할당 커서 */
        exec SQL은 다음에 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 ++)

                sqlvar_t v = cur_sqlda- sqlvar [i];
                char *sqldata = v.sqldata;
                짧은 sqllen = v.sqllen;

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

                스위치 (v.sqltype)

                    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.sqltype);

            printf ( "\ n");

    Exec SQL COR1;
    Exec SQL 커밋;

    Exec SQL 모든 분리;

    반환 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/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)
datconnlimit = -1 (유형 : 5)
datlastsysoid = 11510 (유형 : 1)
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)