토토 꽁 머니 설명자 영역은 다음의 결과를 처리하는 보다 정교한 방법입니다.선택, 가져오기또는 a설명문장. 토토 꽁 머니 설명자 영역은 한 데이터 행의 데이터를 메타데이터 항목과 함께 하나의 데이터 구조로 그룹화합니다. 메타데이터는 결과 열의 특성을 미리 알 수 없는 동적 토토 꽁 머니 문을 실행할 때 특히 유용합니다. Postgre토토 꽁 머니은 설명자 영역을 사용하는 두 가지 방법, 즉 명명된 토토 꽁 머니 설명자 영역과 C 구조 토토 꽁 머니DA를 제공합니다.
명명된 토토 꽁 머니 설명자 영역은 전체 설명자에 관한 정보를 포함하는 헤더와 기본적으로 각각 결과 행의 한 열을 설명하는 하나 이상의 항목 설명자 영역으로 구성됩니다.
토토 꽁 머니 설명자 영역을 사용하기 전에 하나를 할당해야 합니다:
EXEC 토토 꽁 머니 할당 설명자식별자;
식별자는 다음 역할을 합니다.“변수 이름”12416_12512
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 설명자 영역을 생성합니다. 참조섹션 35.7.2.
에설명그리고가져오기진술, 그INTO그리고사용 중키워드는 비슷한 용도로 사용될 수 있습니다. 즉, 설명자 영역에 결과 세트와 메타데이터를 생성합니다.
이제 설명자 영역에서 데이터를 어떻게 가져오나요? 설명자 영역은 명명된 필드가 있는 구조로 생각할 수 있습니다. 헤더에서 필드 값을 검색하여 호스트 변수에 저장하려면 다음 명령을 사용하십시오.
EXEC 토토 꽁 머니 GET 설명자이름:hostvar=필드;
현재 헤더 필드는 하나만 정의되어 있습니다:개수, 존재하는 항목 설명자 영역 수(즉, 결과에 포함된 열 수)를 알려줍니다. 호스트 변수는 정수 유형이어야 합니다. 항목 설명자 영역에서 필드를 가져오려면 다음 명령어를 사용하세요.
EXEC 토토 꽁 머니 GET 설명자이름값num:hostvar=필드;
num은 리터럴 정수이거나 정수를 포함하는 호스트 변수일 수 있습니다. 가능한 필드는 다음과 같습니다:
카디널리티(정수)결과 세트의 행 수
데이터실제 데이터 항목(따라서 이 필드의 데이터 유형은 쿼리에 따라 다름)
DATETIME_INTERVAL_CODE(정수)언제유형is9, 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;
토토 꽁 머니DA 설명자 영역은 쿼리의 결과 세트와 메타데이터를 가져오는 데에도 사용할 수 있는 C 언어 구조입니다. 하나의 구조는 결과 세트의 하나의 레코드를 저장합니다.
EXEC 토토 꽁 머니에는 토토 꽁 머니da.h가 포함됩니다. 토토 꽁 머니da_t *my토토 꽁 머니da; EXEC 토토 꽁 머니 FETCH 3을 mycursor에서 설명자 my토토 꽁 머니da로;
참고하세요토토 꽁 머니키워드가 생략되었습니다. 의 사용 사례에 대한 단락INTO그리고사용 중키워드섹션 35.7.1또한 여기에 추가로 적용됩니다. 에서설명진술하세요설명자다음과 같은 경우 키워드를 완전히 생략할 수 있습니다.INTO키워드가 사용되었습니다:
EXEC 토토 꽁 머니 DESCRIBE prepare_statement INTO my토토 꽁 머니da;
토토 꽁 머니DA를 사용하는 프로그램의 일반적인 흐름은 다음과 같습니다:
쿼리를 준비하고 이에 대한 커서를 선언하십시오.
결과 행에 대한 토토 꽁 머니DA를 선언하십시오.
입력 매개변수에 대한 토토 꽁 머니DA를 선언하고 초기화하십시오(메모리 할당, 매개변수 설정).
입력 토토 꽁 머니DA로 커서를 엽니다.
커서에서 행을 가져와서 출력 토토 꽁 머니DA에 저장합니다.
출력 토토 꽁 머니DA의 값을 호스트 변수로 읽습니다(필요한 경우 변환 포함).
커서를 닫으세요.
입력 토토 꽁 머니DA에 할당된 메모리 영역을 해제합니다.
토토 꽁 머니DA는 세 가지 데이터 구조 유형을 사용합니다:토토 꽁 머니da_t, 토토 꽁 머니var_t및구조체 토토 꽁 머니name.
Postgre토토 꽁 머니의 토토 꽁 머니DA는 IBM DB2 Universal Database의 데이터 구조와 유사하므로 DB2의 토토 꽁 머니DA에 대한 일부 기술 정보는 Postgre토토 꽁 머니의 토토 꽁 머니DA를 더 잘 이해하는 데 도움이 될 수 있습니다.
구조 유형토토 꽁 머니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이것은 결과 집합의 열 배열입니다.
구조 유형토토 꽁 머니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데이터를 가리킵니다. 데이터 형식은에 설명되어 있습니다.섹션 35.4.4.
sqlind널 표시기를 가리킵니다. 0은 null이 아님을 의미하고, -1은 null을 의미합니다.
토토 꽁 머니name필드의 이름.
A 구조체 토토 꽁 머니name구조에는 열 이름이 있습니다. 의 멤버로 사용됩니다.토토 꽁 머니var_t구조. 구조의 정의는 다음과 같습니다.
#define NAMEDATALEN 64
구조체 토토 꽁 머니 이름
짧은 길이;
문자 데이터[NAMEDATALEN];
;
필드의 의미는 다음과 같습니다:
길이필드 이름의 길이를 포함합니다.
데이터실제 필드 이름이 포함되어 있습니다.
토토 꽁 머니DA를 통해 쿼리 결과 집합을 검색하는 일반적인 단계는 다음과 같습니다.
선언토토 꽁 머니da_t결과 세트를 수신하는 구조입니다.
실행가져오기/실행/설명선언된 토토 꽁 머니DA를 지정하는 쿼리를 처리하는 명령입니다.
다음을 보고 결과 세트의 레코드 수를 확인하십시오.토토 꽁 머니n,의 회원토토 꽁 머니da_t구조.
다음에서 각 열의 값을 가져옵니다.토토 꽁 머니var[0], 토토 꽁 머니var[1]등, 회원토토 꽁 머니da_t구조.
다음 행으로 이동(토토 꽁 머니da_t구조) 다음을 수행하여desc_next포인터, 회원토토 꽁 머니da_t구조.
필요에 따라 위 내용을 반복하세요.
다음은 토토 꽁 머니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);
부서지다;
...
토토 꽁 머니DA를 사용하여 입력 매개변수를 준비된 쿼리에 전달하는 일반적인 단계는 다음과 같습니다.
준비된 쿼리 생성(준비된 명령문)
토토 꽁 머니da_t 구조를 입력 토토 꽁 머니DA로 선언하십시오.
입력 토토 꽁 머니DA에 대한 메모리 영역(토토 꽁 머니da_t 구조로)을 할당합니다.
할당된 메모리에 입력 값을 설정(복사)합니다.
입력 토토 꽁 머니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구조. 준비된 쿼리에 두 개 이상의 입력 매개변수가 필요한 경우 애플리케이션은 (매개변수 수 - 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);
다음은 시스템 카탈로그에서 입력 매개변수에 의해 지정된 데이터베이스의 액세스 통계를 가져오는 방법을 설명하는 예제 프로그램입니다.
이 응용 프로그램은 두 개의 시스템 테이블 pg_database 및 pg_stat_database를 데이터베이스 OID에 결합하고 두 개의 입력 매개변수(데이터베이스)로 검색된 데이터베이스 통계를 가져오고 표시합니다.포스트그레및 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 토토 꽁 머니 모두 연결 해제;
전체 프로그램은 다음에 표시됩니다.예 35.1.
예제 35.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)