SQL 디스크립터 영역은 A의 결과를 처리하는보다 정교한 방법입니다select
, fetch
또는 A설명
진술. SQL 디스크립터 영역은 메타 데이터 항목과 함께 한 행의 데이터 데이터를 하나의 데이터 구조로 그룹화합니다.
이름 지정된 SQL 디스크립터 영역은 전체 설명자와 관련된 정보와 하나 이상의 항목 디스크립터 영역을 포함하는 헤더로 구성되어 있으며 기본적으로 각각 결과 행의 한 열을 설명합니다..
SQL 디스크립터 영역을 사용하기 전에 하나를 할당해야합니다.
exec SQL 할당 디스크립터식별자
;
식별자는 역할을합니다.“가변 이름”설명 자 영역. 더 이상 디스크립터가 필요하지 않은 경우 다음을 처리해야합니다.
Exec SQL Dalloce Descriptor식별자
;
디스크립터 메이저 토토 사이트을 사용하려면의 스토리지 대상으로 지정하십시오.in
조항, 호스트 변수를 나열하는 대신 :
Exec SQL Fetch 다음에 MyCursor에서 SQL 디스크립터 MyDesc로 향합니다.
결과 세트가 비어 있으면 디스크립터 메이저 토토 사이트은 여전히 쿼리에서 메타 데이터, 즉 필드 이름을 포함합니다..
아직 실행되지 않은 준비된 쿼리,설명
명령문은 결과 세트의 메타 데이터를 얻는 데 사용될 수 있습니다.
Exec SQL 시작 선언 섹션;
postgresql 9.0 전,SQL
키워드는 선택 사항이므로 사용디스크립터
andSQL 디스크립터
명명 된 SQL 디스크립터 영역을 생산했습니다. 이제 그것은 필수입니다.SQL
키워드는 SQLDA 디스크립터 영역을 생성합니다. 참조섹션 36.7.2.
in설명
andfetch
진술,in
and사용
키워드는 비슷하게 사용될 수 있습니다 : 디스크립터 영역에서 결과 세트와 메타 데이터를 생성합니다.
이제 디스크립터 영역에서 데이터를 어떻게 얻습니까? 디스크립터 영역을 필드 명명 된 구조로 생각할 수 있습니다.
Exec SQL Get Descriptor이름
:hostvar
=필드
;
현재, 헤더 필드는 하나뿐입니다.count
는 얼마나 많은 품목 디스크립터 영역이 존재하는지 알려줍니다 (즉, 결과에 몇 개의 열이 포함되어 있는지). 호스트 변수는 정수 유형이어야합니다.
Exec SQL Get Descriptor이름
valueNum
:hostvar
=필드
;
Num
문자 그대로 정수 또는 정수를 포함하는 호스트 변수 일 수 있습니다. 가능한 필드는 다음과 같습니다.
추기경
(정수)결과 세트의 행 수
데이터
실제 데이터 항목 (따라서이 필드의 데이터 유형은 쿼리에 따라 다름)
dateTime_interVal_code
(정수)when타입
is9
, dateTime_interVal_code
값은입니다.1
for날짜
, 2
forTime
, 3
for타임 스탬프
, 4
for시간대가있는 시간
또는5
for시간대가있는 타임 스탬프
.
DateTime_interVal_Precision
(정수)구현되지 않음
표시기
(정수)표시기 (널 값 또는 값 자리를 나타내는)
key_member
(정수)구현되지 않음
길이
(정수)캐릭터의 데이텀 길이
이름
(String)열 이름
nullable
(정수)구현되지 않음
Octet_length
(정수)바이트에서 데이텀의 문자 표현 길이
정밀
(정수)정밀도 (유형숫자
)
returned_length
(정수)캐릭터의 데이텀 길이
returned_octet_length
(정수)바이트에서 데이텀의 문자 표현 길이
스케일
(정수)스케일 (유형 용숫자
)
타입
(정수)열의 데이터 유형의 숫자 코드
inexecute
, 선언
andOpen
진술,의 효과in
and사용
키워드는 다릅니다. 디스크립터 영역은 쿼리 또는 커서의 입력 매개 변수를 제공하기 위해 수동으로 제작할 수 있습니다.SQL 디스크립터 사용
는 입력 매개 변수를 매개 변수화 쿼리로 전달하는 방법입니다. 이름이 지정된 SQL 디스크립터 영역을 구축하려는 진술은 다음과 같습니다.이름
exec SQL 세트 디스크립터이름
valueNum
필드
= :hostvar
;
PostgreSQL은 하나의 레코드를 하나씩 검색하는 것을 지원합니다fetch
명령문 및이 경우 호스트 변수에 데이터를 저장하면 변수가 배열이라고 가정합니다. 예 :
Exec SQL 시작 선언 섹션;
SQLDA 디스크립터 영역은 쿼리의 결과 세트와 메타 데이터를 얻는 데 사용할 수있는 C 언어 구조입니다. 하나의 구조는 결과 세트에서 한 레코드를 저장합니다.
exec sql 포함 sqlda.h;
SQL
키워드가 생략되었습니다. 의 사용 사례에 대한 단락in
and사용
키워드섹션 36.7.1추가로 여기에 적용하십시오. 에서설명
진술디스크립터
키워드를 완전히 생략 할 수 있습니다in
키워드가 사용됩니다 :
exec SQL repection_statement inciqlda;
SQLDA를 사용하는 프로그램의 일반적인 흐름은 다음과 같습니다.
쿼리 준비하고 커서를 선언합니다.
결과 행에 대한 SQLDA를 선언합니다.
입력 매개 변수에 대한 SQLDA를 선언하고 초기화 (메모리 할당, 매개 변수 설정)..
입력 SQLDA로 커서를 엽니 다.
커서에서 행을 가져 와서 출력 sqlda에 저장합니다.
출력 SQLDA에서 호스트 변수로 값을 읽습니다 (필요한 경우 변환).
커서를 닫습니다.
입력 SQLDA에 할당 된 메모리 영역을 제거합니다.
SQLDA는 세 가지 데이터 구조 유형을 사용합니다.SQLDA_T
, sqlvar_t
및struct sqlname
.
PostgreSQL의 SQLDA는 IBM DB2 범용 데이터베이스와 유사한 데이터 구조를 가지고 있으므로 DB2의 SQLDA에 대한 일부 기술 정보는 Postgresql의 더 나은 이해에 도움이 될 수 있습니다..
구조 유형SQLDA_T
는 실제 SQLDA의 유형입니다. 하나의 레코드를 보유하고 있습니다.SQLDA_T
구조는 링크 된 목록에 링크 된 목록에 연결할 수 있습니다desc_next
필드, 따라서 순서대로 행의 모음을 나타냅니다. 따라서 두 개 이상의 행을 가져 오면 응용 프로그램은를 따라 읽을 수 있습니다.desc_next
각각의 포인터SQLDA_T
노드.
의 정의SQLDA_T
IS :
struct sqlda_struct
필드의 의미는 다음과 같습니다.
SQLDAID
문자 그대로 문자열이 포함되어 있습니다"SQLDA"
.
SQLDABC
할당 된 공간의 크기가 바이트의 크기를 포함합니다.
SQLN
전달 된 경우 매개 변수화 된 쿼리의 입력 매개 변수 수가 포함되어 있습니다.Open
, 선언
또는execute
사용
키워드. 의 출력으로 사용되는 경우select
, execute
또는fetch
진술, 그 값은와 동일합니다SQLD
성명서
SQLD
결과 세트에 필드 수가 포함되어 있습니다.
desc_next
21929_22022desc_next
목록의 다음 항목에 대한 포인터를 보유합니다.
sqlvar
결과 세트의 열의 배열입니다.
구조 유형sqlvar_t
유형 및 길이와 같은 열 값과 메타 데이터를 보유합니다. 유형의 정의는 다음과 같습니다.
struct sqlvar_struct
필드의 의미는 다음과 같습니다.
sqltype
필드의 유형 식별자를 포함합니다. 값은 참조enum ecpgttype
inecpgtype.h
.
sqllen
필드의 이진 길이를 포함합니다. 예를 들어, 4 바이트ecpgt_int
.
SQLDATA
데이터를 가리 킵니다. 데이터 형식은에 설명되어 있습니다.섹션 36.4.4.
sqlind
널 표시기를 가리 킵니다. 0은 null을 의미하지 않으며 -1은 null을 의미합니다.
sqlname
필드의 이름.
A struct sqlname
구조는 열 이름을 보유합니다. 그것은의 멤버로 사용됩니다.sqlvar_t
구조. 구조의 정의는 다음과 같습니다.
#Define NamedAtalen 64
필드의 의미는 다음과 같습니다.
길이
필드 이름의 길이를 포함합니다.
데이터
실제 필드 이름을 포함합니다.
SQLDA를 통해 설정된 쿼리 결과를 검색하는 일반 단계는 다음과 같습니다.
선언SQLDA_T
결과 세트를 수신 할 구조.
executefetch
/execute
/설명
선언 된 SQLDA를 지정하는 쿼리를 처리하는 명령.
보고하여 설정 한 결과의 레코드 수 확인SQLN
,SQLDA_T
구조.
각 열의 값을SQLVAR [0]
, sqlvar [1]
등,SQLDA_T
구조.
다음 행으로 이동 (SQLDA_T
구조)에 따른desc_next
포인터,SQLDA_T
구조.
필요한대로 위에서 반복하십시오.
여기 SQLDA를 통해 세트를 검색하는 예입니다.
먼저, a 선언SQLDA_T
결과 세트를 수신 할 구조.
SQLDA_T *SQLDA1;
다음, 명령에 sqlda를 지정하십시오. 이것은입니다.fetch
명령 예.
exec SQL 다음은 CUR1에서 디스크립터 SQLDA1로 가져옵니다.
행을 검색하기 위해 링크 된 목록을 따라 루프를 실행하십시오.
sqlda_t *cur_sqlda;
루프 내부에서 다른 루프를 실행하여 각 열 데이터를 검색합니다 (sqlvar_t
구조) 행의 구조.
for (i = 0; isqld; i ++)
열 값을 얻으려면를 확인하십시오.sqltype
value, 회원sqlvar_t
구조. 그런 다음 열 유형에 따라 적절한 방법으로 전환하여에서 데이터를 복사하십시오.sqlvar
호스트 변수에 필드
char var_buf [1024];
SQLDA를 사용하여 입력 매개 변수를 준비된 쿼리로 전달하는 일반 단계는 다음과 같습니다.
준비된 쿼리 생성 (준비 문)
SQLDA_T 구조를 입력 SQLDA로 선언합니다.
입력 SQLDA에 대한 메모리 영역 (SQLDA_T 구조로) 할당.
할당 된 메모리의 입력 값 세트 (복사)
입력 SQLDA를 지정하여 커서를 엽니 다.
여기 예입니다.
먼저 준비된 진술을 작성하십시오.
Exec SQL 시작 선언 섹션;
다음, SQLDA에 대한 메모리를 할당하고 입력 매개 변수 수를 설정합니다SQLN
,의 멤버 변수SQLDA_T
구조. 준비된 쿼리에 둘 이상의 입력 매개 변수가 필요한 경우, 응용 프로그램은 (nr. of params -1) * sizeof (sqlvar_t)에 의해 계산되는 추가 메모리 공간을 할당해야합니다.
sqlda_t *sqlda2;
메모리 할당 후 매개 변수 값을에 저장하십시오.sqlvar []
배열. (이것은 SQLDA가 결과 세트를 수신 할 때 열 값을 검색하는 데 사용되는 것과 동일합니다.)이 예에서는 입력 매개 변수가입니다."Postgres"
, 문자열 유형이 있고1
, 정수 유형이 있습니다.
sqlda2-> sqlvar [0] .sqltype = ecpgt_char;
커서를 열고 미리 설정된 SQLDA를 지정하여 입력 매개 변수가 준비된 명령문으로 전달됩니다..
exec sql descriptor sqlda2를 사용하는 CUR1 OPEN CUR1;
마지막으로, 입력 SQLDAS를 사용한 후에 할당 된 메모리 공간은 쿼리 결과를 수신하는 데 사용되는 SQLDA와 달리 명시 적으로 해제되어야합니다..
free (sqlda2);
시스템 카탈로그에서 입력 매개 변수로 지정된 데이터베이스의 액세스 통계를 가져 오는 방법을 설명하는 예제 프로그램이 있습니다.
이 응용 프로그램은 데이터베이스 OID의 PG_DATABASE 및 PG_STAT_DATABASE의 두 시스템 테이블에 결합되며 두 개의 입력 매개 변수 (데이터베이스에 의해 검색되는 데이터베이스 통계를 가져오고 표시합니다.Postgres
및 OID1
).
먼저 입력에 대한 SQLDA를 선언하고 출력을위한 SQLDA를 선언합니다.
exec sql 포함 sqlda.h;
다음, 다음, 데이터베이스에 연결하고, 진술을 준비하고, 준비된 진술에 대한 커서를 선언합니다.
int
다음, 입력 매개 변수에 대한 입력 SQLDA에 값을 넣으십시오. 입력 SQLDA에 대한 메모리를 할당하고 입력 매개 변수 수를로 설정하십시오.SQLN
. 상점 유형, 값 및 가치 길이로sqltype
, SQLDATA
및sqllen
insqlvar
구조.
/* 입력 매개 변수에 대한 SQLDA 구조를 만듭니다. */
입력 SQLDA를 설정 한 후 입력 SQLDA로 커서를 엽니 다.
/* 입력 매개 변수가있는 커서를 엽니 다. */
열린 커서에서 출력 SQLDA로 행을 가져옵니다. (일반적으로 전화해야fetch
루프에서 반복적으로 결과 세트에서 모든 행을 가져 오기 위해.)
while (1)
다음, 링크 된 링크 목록을 따라 SQLDA에서 가져온 레코드를 검색SQLDA_T
구조.
for (cur_sqlda = sqlda1;
첫 번째 레코드에서 각 열을 읽으십시오. 열 수는에 저장됩니다.SQLD
, 첫 번째 열의 실제 데이터는에 저장됩니다.SQLVAR [0]
, 두 멤버SQLDA_T
구조.
/* 모든 열을 연속으로 인쇄하십시오. */
이제 열 데이터가 변수에 저장됩니다v
. 모든 데이텀을 호스트 변수로 복사하여v.sqltype
열의 유형의 경우.
스위치 (v.sqltype)
모든 레코드를 처리 한 후 커서를 닫고 데이터베이스에서 분리하십시오.
Exec SQL COR1;
전체 프로그램이에 표시됩니다.예 36.1.
예 36.1. 예제 SQLDA 프로그램
#include
이 예제의 출력은 다음과 같은 것으로 보일 것입니다 (일부 숫자는 다릅니다).
OID = 1 (유형 : 1)
문서에 맞지 않는 내용이 있으면 일치하지 않습니다.이 양식문서 문제를보고하려면