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

33.7. 설명 영역 사용

범퍼카 토토 설명자 영역은 다음을 위한 보다 정교한 방법입니다. a의 결과를 처리하는 중선택, 가져오기또는설명문장. 범퍼카 토토 설명자 영역 그룹 한 행의 데이터를 메타데이터 항목과 함께 하나로 데이터 구조. 메타데이터는 다음과 같은 경우에 특히 유용합니다. 동적 범퍼카 토토 문을 실행합니다. 여기서 결과의 성격은 다음과 같습니다. 열은 미리 알려지지 않을 수 있습니다. Postgre범퍼카 토토은 두 가지를 제공합니다. 설명자 영역을 사용하는 방법: 명명된 범퍼카 토토 설명자 영역 및 C 구조 범퍼카 토토DA.

33.7.1. 명명된 범퍼카 토토 설명자 지역

명명된 범퍼카 토토 설명자 영역은 헤더로 구성됩니다. 전체 설명자에 관한 정보를 포함하며, 또는 기본적으로 각각 설명하는 더 많은 항목 설명 영역 결과 행에 하나의 열이 있습니다.

범퍼카 토토 설명자 영역을 사용하기 전에 다음을 수행해야 합니다. 하나를 할당하십시오:

EXEC 범퍼카 토토 할당 설명자식별자;

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

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.

설명그리고가져오기문장, theINTO그리고사용 중키워드 유사하게 사용될 수 있습니다: 결과 세트를 생성하고 설명자 영역의 메타데이터입니다.

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

EXEC 범퍼카 토토 GET 설명자이름 :hostvar = 필드;

현재 정의된 헤더 필드는 단 하나뿐입니다:COUNT, 이는 얼마나 많은지 알려줍니다. 항목 설명자 영역이 존재합니다(즉, 항목에 몇 개의 열이 있는지 결과에 포함되어 있습니다). 호스트 변수는 다음 중 하나여야 합니다. 정수형. 항목 설명 영역에서 필드를 가져오려면 다음을 사용하세요. 다음 명령:

EXEC 범퍼카 토토 GET 설명자이름num :hostvar = 필드;

번호리터럴 정수일 수 있음 또는 정수를 포함하는 호스트 변수입니다. 가능한 분야 다음은:

카디널리티(정수)

결과 세트의 행 수

데이터

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

DATETIME_INTERVAL_CODE(정수)

언제TYPEis9, DATETIME_INTERVAL_CODE값을 가지게 됩니다 의1for날짜, 2for시간, 3for타임스탬프, 4for시간과 시간 구역또는5for시간대가 포함된 타임스탬프.

DATETIME_INTERVAL_PRECISION(정수)

구현되지 않음

표시기(정수)

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

KEY_MEMBER(정수)

구현되지 않음

길이(정수)

문자 단위의 데이텀 길이

이름(문자열)

열 이름

NULL 가능(정수)

구현되지 않음

OCTET_LENGTH(정수)

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

정확성(정수)

정밀도(유형용숫자)

RETURNED_LENGTH(정수)

문자 단위의 데이텀 길이

RETURNED_OCTET_LENGTH(정수)

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

규모(정수)

규모(유형용숫자)

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의 유형입니다. 하나의 기록을 보유하고 있습니다. 그리고 둘 또는 더 많은범퍼카 토토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;
    짧은 *sqlind;
    구조체 범퍼카 토토name 범퍼카 토토name;
;

typedef struct 범퍼카 토토var_struct 범퍼카 토토var_t;

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

범퍼카 토토type

필드의 유형 식별자를 포함합니다. 에 대한 값, 참조enum ECPGttypeinecpgtype.h.

범퍼카 토토len

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

범퍼카 토토data

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

sqlind

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

범퍼카 토토name

필드의 이름.

33.7.2.1.3. 구조체 범퍼카 토토 이름 구조

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구조) 다음을 수행하여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구조. 두 개 이상의 입력 매개변수가 필요한 경우 준비된 쿼리를 애플리케이션이 할당해야 합니다. (nr. of params)로 계산되는 추가 메모리 공간 - 1) * 크기(범퍼카 토토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를 사용한 후 할당된 메모리는 공간은 명시적으로 해제되어야 합니다. 쿼리 결과를 수신 중입니다.

무료(범퍼카 토토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 범퍼카 토토 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 범퍼카 토토 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)