35.7. 설명자 영역 사용

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

35.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 디스크립터 영역을 생성합니다섹션 35.7.2.

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

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

Exec 토토 꽁 머니 Get Descriptor이름 :hostvar=필드;

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

Exec 토토 꽁 머니 GET DESCRICTOR이름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(정수)

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

스케일(정수)

스케일 (유형 용숫자)

타입(정수)

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

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

exec 토토 꽁 머니 세트 디스크립터이름valueNum 필드= :hostvar;

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

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

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

Exec 토토 꽁 머니 GET DESCRICTOR MYDESC 값 1 : ID = DATA;

35.7.2. 토토 꽁 머니DA 디스크립터 영역

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

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

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

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

exec 토토 꽁 머니 repection_statement inciqlda;

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

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

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

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

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

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

  6. 출력 토토 꽁 머니DA에서 호스트 변수로 값을 읽으십시오 (필요한 경우 변환)

  7. 커서를 닫습니다.

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

35.7.2.1. 토토 꽁 머니DA 데이터 구조

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

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

35.7.2.1.1. 토토 꽁 머니DA_T 구조

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

의 정의토토 꽁 머니DA_TIS :

struct sqlda_struct

    char 토토 꽁 머니daid [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

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

35.7.2.1.2. 토토 꽁 머니var_t 구조

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

struct 토토 꽁 머니var_struct

    짧은 sqltype;
    짧은 토토 꽁 머니len;
    char *토토 꽁 머니data;
    짧은 *sqlind;
    struct 토토 꽁 머니name 토토 꽁 머니name;
;

typedef struct 토토 꽁 머니var_struct 토토 꽁 머니var_t;

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

토토 꽁 머니TYPE

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

토토 꽁 머니len

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

토토 꽁 머니data

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

sqlind

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

토토 꽁 머니name

필드의 이름.

35.7.2.1.3. struct 토토 꽁 머니name 구조

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

#Define NamedAtalen 64

struct 토토 꽁 머니name

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

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

길이

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

데이터

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

35.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 *토토 꽁 머니data = v.토토 꽁 머니data;
    짧은 토토 꽁 머니len = v.토토 꽁 머니len;
    ...

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

char var_buf [1024];

스위치 (v.토토 꽁 머니type)

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

    ...

35.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] .토토 꽁 머니data = "postgres";
sqlda2- 토토 꽁 머니var [0] .토토 꽁 머니len = 8;

int intval = 1;
sqlda2- 토토 꽁 머니var [1] .sqltype = ecpgt_int;
sqlda2- 토토 꽁 머니var [1] .토토 꽁 머니data = (char *) & intval;
sqlda2- 토토 꽁 머니var [1] .토토 꽁 머니len = sizeof (intval);

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

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

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

free (토토 꽁 머니da2);

35.7.2.4. 토토 꽁 머니DA를 사용한 샘플 응용 프로그램

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

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

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

exec sql 포함 sqlda.h;

토토 꽁 머니da_t *토토 꽁 머니da1; / * 출력 설명 자 */
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] .토토 꽁 머니data = "postgres";
    sqlda2- 토토 꽁 머니var [0] .토토 꽁 머니len = 8;

    intval = 1;
    sqlda2- 토토 꽁 머니var [1] .sqltype = ecpgt_int;
    sqlda2- 토토 꽁 머니var [1] .토토 꽁 머니data = (char *) & intval;
    sqlda2- 토토 꽁 머니var [1] .토토 꽁 머니len = 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 *토토 꽁 머니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 intval;
                더블 볼;
                서명되지 않은 긴 긴 int longlongval;

                CASE 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 토토 꽁 머니 COR1;
    Exec 토토 꽁 머니 커밋;

    EXEC 토토 꽁 머니 모든 분리;

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

예 35.1. 예제 토토 꽁 머니DA 프로그램

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

exec sql은 sqlda.h;

토토 꽁 머니da_t *토토 꽁 머니da1; / * 출력에 대한 설명자 */
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] .토토 꽁 머니data = "postgres";
    sqlda2- 토토 꽁 머니var [0] .토토 꽁 머니len = 8;

    intval = 1;
    sqlda2- 토토 꽁 머니var [1] .sqltype = ecpgt_int;
    sqlda2- 토토 꽁 머니var [1] .토토 꽁 머니data = (char *) & intval;
    sqlda2- 토토 꽁 머니var [1] .토토 꽁 머니len = 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 *토토 꽁 머니data = v.토토 꽁 머니data;
                짧은 토토 꽁 머니len = v.토토 꽁 머니len;

                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, 토토 꽁 머니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);
                        부서지다;

                    CASE ECPGT_LONG_LONG : / * BIGINT * /
                        memcpy (& longlongval, 토토 꽁 머니data, 토토 꽁 머니len);
                        snprintf (var_buf, sizeof (var_buf), "%lld", longlongval);
                        부서지다;

                    기본:

                        int i;
                        memset (var_buf, 0, sizeof (var_buf));
                        for (i = 0; i <토토 꽁 머니len; i ++)

                            char tmpbuf [16];
                            snprintf (tmpbuf, sizeof (tmpbuf), "%02x", (서명 된 char) 토토 꽁 머니data [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)
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)

수정 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면