inPostgre사설 토토 : 문서 : 개발 : 34.3. 실행 사설 토토 명령내장 된 젠 토토 프로그램에서 젠 토토 문을 실행하는 방법을 보았습니다. 이러한 진술 중 일부는 고정 값 만 사용했으며 사용자가 제공 한 값을 명령문에 삽입하거나 프로그램이 쿼리에서 반환 한 값을 처리하도록하는 방법을 제공하지 않았습니다. 이러한 종류의 진술은 실제 응용 프로그램에서 실제로 유용하지 않습니다. 이 섹션은 C 프로그램과 내장 된 젠 토토 문들 사이에 데이터를 전달할 수있는 방법을 자세히 설명합니다.호스트 변수. 임베디드 젠 토토 프로그램에서는 젠 토토 문을 고려합니다.손님C 프로그램 코드에서호스트 언어. 따라서 C 프로그램의 변수를라고합니다.호스트 변수.
Postgre젠 토토 백엔드와 ECPG 응용 프로그램 간의 값을 교환하는 또 다른 방법은에 설명 된 젠 토토 디스크립터 사용입니다.Postgre토토 : 문서 : 개발 : 34.7. 설명자 영역 사용.
C 프로그램과 젠 토토 문 사이의 데이터 전달은 포함 된 젠 토토에서 특히 간단합니다. 프로그램에 데이터를 표시하는 대신 값을 올바르게 인용하는 것과 같은 다양한 합병증을 수반하는 문장에 데이터를 붙여 넣는 대신 C 변수의 이름을 콜론에 의해 접두사에 표시 한 젠 토토 문에 작성할 수 있습니다. 예를 들어:
Exec 젠 토토 insert instable 값 (: v1, 'foo', : v2);
이 진술은 이름라는 두 개의 c 변수를 나타냅니다.v1
및v2
그리고 또한 일반 젠 토토 문자열 리터럴을 사용하여 한 종류의 데이터 또는 다른 데이터를 사용하는 것으로 제한되지 않음을 설명합니다..
젠 토토 문에 C 변수를 삽입하는이 스타일은 젠 토토 문에서 값 표현식이 예상되는 곳에서 작동합니다.
예를 들어 쿼리의 매개 변수와 같은 프로그램에서 데이터를 데이터베이스로 전달하거나 데이터베이스에서 데이터를 프로그램으로 다시 전달하려면이 데이터를 포함하려는 C 변수는 특별히 표시된 섹션에서 선언해야하므로 임베드 된 젠 토토 Preprocessor는 그들에 대한 인식이 이루어집니다..
이 섹션은 :부터 시작합니다.
Exec 젠 토토 시작 선언 섹션;
:로 끝납니다.
exec 젠 토토 종료 선언 섹션;
해당 라인 사이에 :과 같은 일반 C 변수 선언이 있어야합니다.
int x = 4; Char Foo [16], Bar [16];
보시다시피, 초기 값을 변수에 선택적으로 할당 할 수 있습니다. 변수의 범위는 프로그램 내에서 선언 섹션의 위치에 따라 결정됩니다. 또한 다음 구문으로 변수를 선언 할 수 있으며, 이는 선언 섹션을 암시 적으로 생성합니다.
Exec 젠 토토 int i = 4;
원하는만큼 프로그램에 많은 선언 섹션을 가질 수 있습니다.
선언은 또한 출력 파일에 정상적인 c 변수로 반향되므로 다시 선언 할 필요가 없습니다. 젠 토토 명령에 사용되지 않는 변수는이 특수 섹션 밖에서 정상적으로 선언 될 수 있습니다.
구조 또는 조합의 정의는 a 내부에 나열되어 있어야합니다.선언
섹션. 그렇지 않으면 사전 처리기는 정의를 모르기 때문에 이러한 유형을 처리 할 수 없습니다.
이제 프로그램에서 생성 된 데이터를 젠 토토 명령으로 전달할 수 있어야합니다. 그러나 쿼리 결과를 어떻게 검색합니까? 이를 위해 임베디드 젠 토토은 일반적인 명령의 특수 변형을 제공합니다select
andfetch
. 이 명령에는 특별한in
검색된 값이 저장 될 호스트 변수를 지정하는 조항.select
단일 행만 반환하는 쿼리에 사용됩니다.Fetch
커서를 사용하여 여러 행을 반환하는 쿼리에 사용됩니다.
여기 예입니다.
/* *이 테이블을 가정하십시오. * 테이블 생성 테스트 1 (a int, b varchar (50)); */ Exec 젠 토토 시작 선언 섹션; int v1; 바르 르 차 V2; Exec 젠 토토 END DELLARE SECTION; ... exec 젠 토토 a, b에 : v1, : v2 test;
thein
SELECT 목록과 사이에 조항이 나타납니다.From
절. 선택 목록의 요소 수와 다음 목록in
(대상 목록이라고도 함)는 동일해야합니다.
다음은 명령을 사용하는 예입니다Fetch
:
Exec 젠 토토 시작 선언 섹션; int v1; 바르 르 차 V2; Exec 젠 토토 END DELLARE SECTION; ... Exec 젠 토토 선택 A, B Test에서 FOO Cursor를 선언합니다. ... 하다 ... exec sql 다음은 foo에서 v1, : v2; ... 하는 동안 (...);
여기into
조항은 모든 정상적인 조항 후에 나타납니다.
ECPG 응용 프로그램이 Postgre젠 토토 서버와 C 응용 프로그램 간의 값을 교환 할 때, 예를 들어 서버에서 쿼리 결과를 검색하거나 입력 매개 변수를 사용하여 젠 토토 문을 실행할 때와 같은 값은 Postgre젠 토토 데이터 유형과 호스트 언어 변수간에 값을 변환해야합니다 (C 언어 데이터 유형, 구체적). ECPG의 주요 요점 중 하나는 대부분의 경우이를 자동으로 처리한다는 것입니다.
이와 관련하여 두 가지 종류의 데이터 유형이 있습니다.Integer
and텍스트
, 응용 프로그램에서 직접 읽고 쓸 수 있습니다. 와 같은 기타 Postgre젠 토토 데이터 유형타임 스탬프
and숫자
특수 라이브러리 기능을 통해서만 액세스 할 수 있습니다. 보다섹션 34.4.4.2.
표 34.1어떤 Postgre젠 토토 데이터 유형이 C 데이터 유형에 해당하는지 보여줍니다. 주어진 Postgre젠 토토 데이터 유형의 값을 보내거나 받으려면 선언 섹션에서 해당 C 데이터 유형의 C 변수를 선언해야합니다..
표 34.1. Postgre젠 토토 데이터 유형과 C 변수 유형 간의 매핑
Postgre젠 토토 데이터 유형 | 호스트 변수 유형 |
---|---|
smallint |
짧은 |
정수 |
int |
bigint |
긴 긴 int |
10 진수 |
Decimal [a] |
숫자 |
숫자 [a] |
Real |
float |
이중 정밀 |
더블 |
SmallSerial |
짧은 |
Serial |
int |
bigserial |
긴 긴 int |
OID |
부호없는 int |
문자 ( , varchar ( , 텍스트 |
char [ , varchar [ |
이름 |
char [namedatalen] |
타임 스탬프 |
타임 스탬프 [A] |
간격 |
간격 [a] |
날짜 |
날짜 [a] |
부울 |
bool [B] |
BYTEA |
char * , Bytea [ |
[A]이 유형은 특수 라이브러리 기능을 통해서만 액세스 할 수 있습니다. 보다섹션 34.4.4.2. [B]선언 |
젠 토토 문자열 데이터 유형을 처리하려면Varchar
and텍스트
, 호스트 변수를 선언하는 두 가지 가능한 방법이 있습니다.
한 가지 방법은 사용 중char []
, 배열char
, 이것은 C에서 문자 데이터를 처리하는 가장 일반적인 방법입니다.
exec 젠 토토 시작 선언 섹션; char str [50]; EXEC 젠 토토 종료 선언 섹션;
길이를 직접 돌봐야합니다. 이 호스트 변수를 49 자 이상의 문자열을 반환하는 쿼리의 대상 변수로 사용하면 버퍼 오버플로가 발생합니다.
다른 방법은 사용 중입니다.Varchar
유형은 ECPG에서 제공하는 특수 유형입니다. 유형 배열에 대한 정의Varchar
지명struct
모든 변수에 대해. 다음과 같은 선언 :
Varchar var [180];
|
Struct varchar_var int len; char arr [180]; var;
회원ARR
종료 제로 바이트를 포함하여 문자열을 호스팅합니다. 따라서 문자열을 a 저장하려면Varchar
호스트 변수, 호스트 변수는 제로 바이트 터미네이터를 포함한 길이로 선언해야합니다. 회원Len
에 저장된 문자열의 길이를 유지합니다.ARR
종료 제로 바이트없이. 호스트 변수가 쿼리의 입력으로 사용되는 경우, ifStrlen (ARR)
andLen
다르고 짧은 것이 사용됩니다.
Varchar
상류 또는 소문자로 작성할 수는 있지만 혼합 된 경우에는 없습니다.
char
andVarchar
호스트 변수는 다른 젠 토토 유형의 값을 보유 할 수 있으며,이 유형은 문자열 양식에 저장됩니다.
ECPG에는 Postgre젠 토토 서버의 일부 특수 데이터 유형과 쉽게 상호 작용하는 데 도움이되는 몇 가지 특수 유형이 포함되어 있습니다. 특히에 대한 지원을 구현했습니다.숫자
, Decimal
, 날짜
, 타임 스탬프
27548_27556간격
유형. 이러한 데이터 유형은 원시적 호스트 변수 유형에 유용하게 매핑 될 수 없습니다 (예 :int
, 긴 긴 int
또는char []
)는 복잡한 내부 구조를 가지고 있기 때문입니다. 응용 프로그램은 특수 유형의 호스트 변수를 선언하고 PGTypes 라이브러리에서 기능을 사용하여 액세스하여 이러한 유형을 처리합니다. pgtypes 라이브러리,에 자세히 설명 된토토 사이트 순위 PostgreSQL : 문서 : 개발 : 34.6. PGTYPES 라이브러리예를 들어 타임 스탬프에 간격을 추가하기 위해 젠 토토 Server에 쿼리를 보낼 필요가 없도록 이러한 유형을 처리하는 기본 기능이 포함되어 있습니다.
다음 하위 섹션에서는 이러한 특수 데이터 유형을 설명합니다. PGTYPES 라이브러리 기능에 대한 자세한 내용은 참조하십시오.토토 사이트 순위 PostgreSQL : 문서 : 개발 : 34.6. PGTYPES 라이브러리.
다음은 처리 패턴입니다타임 스탬프
ECPG 호스트 응용 프로그램의 변수.
먼저, 프로그램에는에 대한 헤더 파일을 포함해야합니다.타임 스탬프
유형 :
#include <pgtypes_timestamp.h
다음, 호스트 변수를 유형으로 선언타임 스탬프
선언 섹션 :
Exec 젠 토토 시작 선언 섹션; 타임 스탬프 TS; EXEC 젠 토토 종료 선언 섹션;
그리고 호스트 변수에 값을 읽은 후 PgTypes 라이브러리 기능을 사용하여 처리하십시오. 다음 예에서타임 스탬프
값은 텍스트 (ASCII) 양식으로 변환pgtypestimestamp_to_asc ()
기능 :
exec sql 선택 now () :: timestamp in : ts; printf ( "ts = %s \ n", pgtypestimestamp_to_asc (ts));
이 예제는 다음과 같은 결과를 보여줍니다 :
TS = 2010-06-27 18 : 03 : 56.949343
또한 날짜 유형은 같은 방식으로 처리 할 수 있습니다. 프로그램에는 포함해야합니다pgtypes_date.h
, 호스트 변수를 날짜 유형으로 선언하고 날짜 값을 텍스트 양식으로 변환pgtypesdate_to_asc ()
함수. PGTYPES 라이브러리 기능에 대한 자세한 내용은 참조하십시오.토토 사이트 순위 PostgreSQL : 문서 : 개발 : 34.6. PGTYPES 라이브러리.
간격
유형은 또한와 유사합니다.타임 스탬프
및날짜
유형. 그러나 AN에 대한 메모리를 할당하는 것이 필요합니다간격
명시 적으로 값을 입력하십시오. 다시 말해, 변수의 메모리 공간은 스택 메모리가 아닌 힙 메모리에 할당되어야합니다.
여기 예제 프로그램이 있습니다 :
#include <stdio.h #include <stdlib.h #include <pgtypes_interval.h int 메인 (void) Exec 젠 토토 시작 선언 섹션; 간격 *in; Exec 젠 토토 END DELLARE SECTION; exec sql testdb에 연결; Exec 젠 토토 선택 PG_CATALOG.SET_CONFIG ( 'search_Path', '', False); Exec 젠 토토 커밋; in = pgtypesinterval_new (); Exec 젠 토토 선택 '1 분':: 간격 : in; printf ( "interval = %s \ n", pgtypesinterval_to_asc (in)); pgtypesinterval_free (in); Exec 젠 토토 커밋; Exec 젠 토토 모든 분리; 반환 0;
숫자
및Decimal
유형은와 유사합니다간격
유형 : 포인터를 정의하고, 힙에 일부 메모리 공간을 할당하고, pgtypes 라이브러리 기능을 사용하여 변수에 액세스해야합니다. PGTYPES 라이브러리 기능에 대한 자세한 내용은 참조하십시오.토토 사이트 순위 PostgreSQL : 문서 : 개발 : 34.6. PGTYPES 라이브러리.
기능은 특별히 제공됩니다.소수점
타입. 응용 프로그램은 a로 변환해야합니다.숫자
추가 처리를 수행하기 위해 PGTYPES 라이브러리 기능을 사용하는 변수.
여기 예제 프로그램 처리숫자
및Decimal
변수 유형.
#include <stdio.h #include <stdlib.h #include <pgtypes_numeric.h 젠 토토ERROR가 중지 될 때마다 젠 토토 EXEC; int 메인 (void) Exec 젠 토토 시작 선언 섹션; 숫자 *num; 숫자 *num2; 10 진수 *12 월; Exec 젠 토토 END DELLARE SECTION; exec sql testdb에 연결; Exec 젠 토토 선택 PG_CATALOG.SET_CONFIG ( 'search_Path', '', False); Exec 젠 토토 커밋; num = pgtypesnumeric_new (); dec = pgtypesdecimal_new (); Exec 젠 토토 Select 12.345 :: Numeric (4,2), 23.456 :: Decimal (4,2) in : num, : dec; printf ( "numeric = %s \ n", pgtypesnumeric_to_asc (num, 0)); printf ( "numeric = %s \ n", pgtypesnumeric_to_asc (num, 1)); printf ( "numeric = %s \ n", pgtypesnumeric_to_asc (num, 2)); /* 소수점을 숫자로 변환하여 소수점 값을 표시합니다. */ num2 = pgtypesnumeric_new (); pgtypesnumeric_from_decimal (dec, num2); printf ( "decimal = %s \ n", pgtypesnumeric_to_asc (num2, 0)); printf ( "decimal = %s \ n", pgtypesnumeric_to_asc (num2, 1)); printf ( "decimal = %s \ n", pgtypesnumeric_to_asc (num2, 2)); pgtypesnumeric_free (num2); pgtypesdecimal_free (12 월); pgtypesnumeric_free (num); Exec 젠 토토 커밋; Exec 젠 토토 모든 분리; 반환 0;
BYTEA
유형은와 유사합니다Varchar
. 유형 배열에 대한 정의BYTEA
는 모든 변수에 대해 명명 된 구조로 변환됩니다. 다음과 같은 선언 :
Bytea var [180];
|
Struct Bytea_var int len; char arr [180]; var;
회원ARR
이진 형식 데이터를 호스트합니다. 또한 처리 할 수 있습니다'\0'
데이터의 일부로Varchar
. 데이터는/to hex 형식에서 변환되고 ecpglib에 의해 전송/수신됩니다.
BYTEA
변수는 만 사용할 수 있습니다bytea_output로 설정되었습니다hex
.
호스트 변수로서 배열, typedefs, structs 및 pointers를 사용할 수도 있습니다.
호스트 변수로 배열에 대한 두 가지 사용 사례가 있습니다. 첫 번째는 텍스트 문자열을 저장하는 방법입니다.char []
또는varchar []
, 설명 된대로섹션 34.4.4.1. 두 번째 유스 케이스는 커서를 사용하지 않고 쿼리 결과에서 여러 행을 검색하는 것입니다. 배열이 없으면 여러 행으로 구성된 쿼리 결과를 처리하려면 커서를 사용해야합니다.Fetch
명령. 그러나 배열 호스트 변수를 사용하면 한 번에 여러 행을 수신 할 수 있습니다. 배열의 길이는 모든 행을 수용 할 수 있도록 정의되어야합니다. 그렇지 않으면 버퍼 오버플로가 발생할 수 있습니다.
다음 예제 스캔PG_DATABASE
시스템 테이블과 사용 가능한 데이터베이스의 모든 OID 및 이름을 표시합니다.
int 메인 (void) Exec 젠 토토 시작 선언 섹션; int dbid [8]; char dbname [8] [16]; int i; Exec 젠 토토 END DELLARE SECTION; memset (dbname, 0, sizeof (char) * 16 * 8); memset (dbid, 0, sizeof (int) * 8); exec sql testdb에 연결; Exec 젠 토토 선택 PG_CATALOG.SET_CONFIG ( 'search_Path', '', False); Exec 젠 토토 커밋; /* 여러 행을 한 번에 배열로 검색합니다. */ exec 젠 토토 OID, DATNAME를 선택하십시오 : DBID, : PG_DATABASE의 DBNAME; for (i = 0; i <8; i ++) printf ( "oid =%d, dbname =%s \ n", dbid [i], dbname [i]); Exec 젠 토토 커밋; Exec 젠 토토 모든 분리; 반환 0;
이 예제는 다음과 같은 결과를 보여줍니다. (정확한 값은 지역 상황에 따라 다릅니다.)
oid = 1, dbname = 템플릿 1 OID = 11510, dbname = template0 oid = 11511, dbname = postgres oid = 313780, dbname = testdb oid = 0, dbname = oid = 0, dbname = oid = 0, dbname =
멤버 이름이 쿼리 결과의 열 이름과 일치하는 구조는 한 번에 여러 열을 검색하는 데 사용할 수 있습니다. 구조는 단일 호스트 변수에서 여러 열 값을 처리 할 수 있습니다.
다음 예제는 사용 가능한 데이터베이스의 OID, 이름 및 크기를 검색합니다.PG_DATABASE
시스템 테이블 및 사용pg_database_size ()
함수. 이 예에서는 구조 변수dbinfo_t
select
결과는 여러 호스트 변수를 넣지 않고 하나의 결과 행을 검색하는 데 사용됩니다Fetch
진술.
Exec 젠 토토 시작 선언 섹션; typedef struct int oid; char datname [65]; 긴 긴 INT 크기; dbinfo_t; dbinfo_t dbval; Exec 젠 토토 END DELLARE SECTION; memset (& dbval, 0, sizeof (dbinfo_t)); Exec 젠 토토은 PG_DATABASE의 크기로 SELECT OID, DATNAME, PG_DATABASE_SIZE (OID)에 대한 CUR1 커서를 선언합니다. Exec 젠 토토 Open CUR1; / * 결과 세트의 끝이 도달하면 while loop */ 찾을 수 없을 때마다 Exec 젠 토토이 중단됩니다. 동안 (1) /* 여러 열을 하나의 구조로 가져옵니다. */ exec 젠 토토은 cur1에서 다음과 같이 가져옵니다 : dbval; /* 구조의 구성원을 인쇄합니다. */ printf ( "oid =%d, datname =%s, size =%lld \ n", dbval.oid, dbval.datname, dbval.size); Exec 젠 토토 Clos Cur1;
이 예제는 다음과 같은 결과를 보여줍니다. (정확한 값은 지역 상황에 따라 다릅니다.)
oid = 1, datname = template1, size = 4324580 OID = 11510, datname = template0, size = 4243460 OID = 11511, datname = postgres, size = 4324580 OID = 313780, datname = testdb, size = 8183012
구조 호스트 변수“흡수”필드만큼 구조만큼 많은 열. 추가 열은 다른 호스트 변수에 지정될 수 있습니다. 예를 들어, 위의 프로그램은 다음과 같이 재구성 될 수 있습니다.size
구조 외부의 변수 :
Exec 젠 토토 시작 선언 섹션; typedef struct int oid; char datname [65]; dbinfo_t; dbinfo_t dbval; 긴 긴 INT 크기; Exec 젠 토토 END DELLARE SECTION; memset (& dbval, 0, sizeof (dbinfo_t)); Exec 젠 토토은 PG_DATABASE의 크기로 SELECT OID, DATNAME, PG_DATABASE_SIZE (OID)에 대한 CUR1 커서를 선언합니다. Exec 젠 토토 Open CUR1; / * 결과 세트의 끝이 도달하면 while loop */ 찾을 수 없을 때마다 Exec 젠 토토이 중단됩니다. 동안 (1) /* 여러 열을 하나의 구조로 가져옵니다. */ exec 젠 토토 CUR1에서 다음과 같이 : dbval, : size; /* 구조의 구성원을 인쇄합니다. */ printf ( "oid =%d, datname =%s, size =%lld \ n", dbval.oid, dbval.datname, size); Exec 젠 토토 Clos Cur1;
사용typedef
새로운 유형을 이미 기존 유형에 매핑하는 키워드
Exec 젠 토토 시작 선언 섹션; typedef char mychartype [40]; typedef long serial_t; EXEC 젠 토토 종료 선언 섹션;
당신도 사용할 수 있습니다 :
exec 젠 토토 type serial_t는 길다;
이 선언은 선언 섹션의 일부일 필요는 없습니다. 즉, 일반적인 C 문으로 typedefs를 쓸 수도 있습니다.
당신이 a로 선언하는 모든 단어typedef
에서 젠 토토 키워드로 사용할 수 없습니다Exec 젠 토토
같은 프로그램에서 나중에 명령합니다. 예를 들어, 이것은 작동하지 않습니다 :
Exec 젠 토토 시작 선언 섹션; typedef int start; Exec 젠 토토 END DELLARE SECTION; ... 실행 젠 토토 트랜잭션 시작;
ECPG는 구문 오류를보고합니다.트랜잭션 시작
, 더 이상 인식되지 않기 때문에시작
젠 토토 키워드로서, typedef로만. (그러한 충돌이 있고 typedef의 이름을 바꾸는 경우 비현실적으로 보이면를 사용하여 젠 토토 명령을 작성할 수 있습니다.Postgre스포츠 토토 베트맨 : 문서 : 개발 : 34.5. 동적 스포츠 토토 베트맨.)
inPostgre젠 토토v16 이전에 릴리스, typedef 이름으로 젠 토토 키워드를 사용하면 이름을 젠 토토 키워드로 사용하는 대신 TypEdef 자체 사용과 관련된 구문 오류가 발생할 수 있습니다. 새로운 동작은 기존 ECPG 응용 프로그램이 새로운 상태에서 재 컴파일 될 때 문제를 일으킬 가능성이 적습니다Postgre젠 토토새 키워드로 릴리스.
가장 일반적인 유형으로 포인터를 선언 할 수 있습니다. 그러나 포인터를 자동 할당없이 쿼리의 대상 변수로 사용할 수는 없습니다. 보다Postgre토토 : 문서 : 개발 : 34.7. 설명자 영역 사용자동 배치에 대한 자세한 내용은
exec 젠 토토 시작 선언 섹션; int *intp; char ** charp; EXEC 젠 토토 종료 선언 섹션;
이 섹션에는 ECPG 애플리케이션에서 Nonscalar 및 사용자 정의 젠 토토 레벨 데이터 유형을 처리하는 방법에 대한 정보가 포함되어 있습니다. 이는 이전 섹션에서 설명한 비 프라이드 유형의 호스트 변수의 처리와는 다릅니다.
다차원 젠 토토 레벨 어레이는 ECPG에서 직접 지원되지 않습니다. 1 차원 젠 토토 레벨 어레이는 C 배열 호스트 변수에 매핑 될 수 있고 그 반대도 마찬가지입니다. 그러나 명령문을 작성할 때 ECPG는 열의 유형을 알지 못하므로 C 배열이 해당 젠 토토 레벨 어레이에 입력되는지 확인할 수 없습니다. 젠 토토 문의 출력을 처리 할 때 ECPG는 필요한 정보를 가지고 있으므로 두 배열인지 확인합니다.
쿼리가 액세스하는 경우요소배열의 별도로, 이렇게하면 ECPG에서 어레이를 사용하지 않습니다. 그런 다음 요소 유형에 매핑 될 수있는 유형을 갖는 호스트 변수를 사용해야합니다. 예를 들어, 열 유형이 배열 인 경우정수
, 유형의 호스트 변수int
를 사용할 수 있습니다. 또한 요소 유형이 인 경우Varchar
또는텍스트
, 유형의 호스트 변수char []
또는varchar []
사용할 수 있습니다.
여기 예입니다. 다음 표를 가정하십시오.
테이블 생성 t3 ( II 정수 [] ); testdb = select * from t3; II ------------- 1,2,3,4,5
다음 예제 프로그램은 배열의 4 번째 요소를 검색하고이를 유형의 호스트 변수에 저장합니다int
:
exec 젠 토토 시작 선언 섹션; int II; Exec 젠 토토 END DELLARE SECTION; t3에서 Select II [4]에 대한 exec 젠 토토 선언 cur1 커서; Exec 젠 토토 Open CUR1; 찾을 수 없을 때마다 Exec 젠 토토이 중단됩니다. 동안 (1) exec sql fetch에서 cur1에서 : ii; printf ( "ii =%d \ n", ii); Exec 젠 토토 Clos Cur1;
이 예제는 다음과 같은 결과를 보여줍니다.
ii = 4
배열 유형 호스트 변수에서 여러 배열 요소를 여러 요소에 매핑하려면 배열 열의 각 요소와 호스트 변수 배열의 각 요소는 별도로 관리되어야합니다.
Exec 젠 토토 시작 선언 섹션; int II_A [8]; Exec 젠 토토 END DELLARE SECTION; SELECT II [1], II [2], II [3], II [4]에 대한 EXEC 젠 토토 선언 CUR1 커서; Exec 젠 토토 Open CUR1; 찾을 수 없을 때마다 Exec 젠 토토이 중단됩니다. 동안 (1) exec 젠 토토은 cur1에서 다음과 같이 가져옵니다 : ii_a [0], : ii_a [1], : ii_a [2], : ii_a [3]; ...
다시 참고
Exec 젠 토토 시작 선언 섹션; int II_A [8]; Exec 젠 토토 END DELLARE SECTION; exec 젠 토토 T3의 Select II에 대한 CUR1 커서 선언; Exec 젠 토토 Open CUR1; 찾을 수 없을 때마다 Exec 젠 토토이 중단됩니다. 동안 (1) /* 잘못된 */ CUR1에서 EXEC 젠 토토 페치 : II_A; ...
배열 유형 열을 배열 호스트 변수에 직접 매핑 할 수 없기 때문에이 경우 올바르게 작동하지 않습니다.
다른 해결 방법은 유형의 호스트 변수에 외부 문자열 표현에 배열을 저장하는 것입니다char []
또는varchar []
. 이 표현에 대한 자세한 내용은 참조하십시오.섹션 8.15.2. 이것은 배열이 호스트 프로그램의 배열로 자연스럽게 액세스 할 수 없음을 의미합니다 (텍스트 표현을 구문 분석하는 추가 처리없이).
복합 유형은 ECPG에서 직접 지원되지 않지만 쉬운 해결 방법이 가능합니다. 사용 가능한 해결 방법은 위의 배열에 대해 설명 된 것과 유사합니다. 각 속성에 별도로 액세스하거나 외부 문자열 표현을 사용하십시오.
다음 예제는 다음 유형과 표를 가정합니다.
유형 comp_t 생성 (Intval Integer, TextVal Varchar (32)); 테이블 t4 (compval comp_t) 만들기; t4 값에 삽입 ((256, 'postgresql');
가장 분명한 해결책은 각 속성에 별도로 액세스하는 것입니다. 다음 프로그램은 유형의 각 속성을 선택하여 예제 테이블에서 데이터를 검색합니다comp_t
별도로 :
Exec 젠 토토 시작 선언 섹션; int intval; Varchar TextVal [33]; Exec 젠 토토 END DELLARE SECTION; /* 복합 유형 열의 각 요소를 선택 목록에 넣습니다. */ exec 젠 토토 SELECT (Compval) .intVal, (Compval) .textVal에서 CUR1 커서를 선언합니다. Exec 젠 토토 Open CUR1; 찾을 수 없을 때마다 Exec 젠 토토이 중단됩니다. 동안 (1) /* 복합 유형 열의 각 요소를 호스트 변수로 가져옵니다. */ exec 젠 토토 CUR1에서 다음과 같이 가져옵니다 : intval, : textVal; printf ( "intval =%d, textVal =%s \ n", intval, textVal.arr); Exec 젠 토토 Clos Cur1;
이 예를 향상시키기 위해 호스트 변수는에 값을 저장합니다.fetch
명령을 하나의 구조로 수집 할 수 있습니다. 구조 양식의 호스트 변수에 대한 자세한 내용은 참조하십시오.섹션 34.4.4.3.2. 구조로 전환하려면 예를 다음과 같이 수정할 수 있습니다. 두 호스트 변수intval
andTextVal
,comp_t
구조 및 구조는에 지정되어 있습니다.fetch
명령.
Exec 젠 토토 시작 선언 섹션; typedef struct int intval; Varchar TextVal [33]; comp_t; comp_t compval; Exec 젠 토토 END DELLARE SECTION; /* 복합 유형 열의 각 요소를 선택 목록에 넣습니다. */ exec 젠 토토 SELECT (Compval) .intVal, (Compval) .textVal에서 CUR1 커서를 선언합니다. Exec 젠 토토 Open CUR1; 찾을 수 없을 때마다 Exec 젠 토토이 중단됩니다. 동안 (1) /* 선택 목록의 모든 값을 하나의 구조로 넣습니다. */ CUR1에서 EXEC 젠 토토 가져 오기 : Compval; printf ( "intval =%d, textVal =%s \ n", compval.intval, compval.textVal.arr); Exec 젠 토토 Clos Cur1;
구조가 사용되지만Fetch
명령, 속성 이름select
절은 하나씩 지정됩니다. 이것은 a를 사용하여 향상 될 수 있습니다.*
복합 유형 값의 모든 속성을 요구합니다.
... Exec 젠 토토 선언 CUR1 커서는 SELECT (Compval)*에서 T4에서; Exec 젠 토토 Open CUR1; 찾을 수 없을 때마다 Exec 젠 토토이 중단됩니다. 동안 (1) /* 선택 목록의 모든 값을 하나의 구조로 넣습니다. */ CUR1에서 EXEC 젠 토토 가져 오기 : Compval; printf ( "intval =%d, textVal =%s \ n", compval.intval, compval.textVal.arr);
ECPG가 복합 유형 자체를 이해하지 못하더라도 복합 유형은 거의 완벽하게 구조에 매핑 될 수 있습니다..
마지막으로, 유형의 호스트 변수에 외부 문자열 표현에 복합 유형 값을 저장할 수도 있습니다char []
또는varchar []
. 그러나 그렇게하면 호스트 프로그램에서 값의 필드에 액세스하는 것은 쉽지 않습니다.
새로운 사용자 정의 기본 유형은 ECPG에서 직접 지원되지 않습니다. 유형의 외부 문자열 표현 및 호스트 변수를 사용할 수 있습니다char []
또는varchar []
,이 솔루션은 실제로 많은 유형에 적합하고 충분합니다.
여기 데이터 유형을 사용하는 예입니다복잡한
예제에서PostgreSQL : 문서 : 개발 : 36.13. 사용자 정의 와이즈 토토. 해당 유형의 외부 문자열 표현은입니다.(%f,%f)
, 함수에 정의되어 있습니다complex_in ()
및complex_out ()
함수PostgreSQL : 문서 : 개발 : 36.13. 사용자 정의 와이즈 토토. 다음 예제는 복잡한 유형 값을 삽입합니다(1,1)
및(3,3)
열로a
및b
, 그 후 테이블에서 선택하십시오.
exec 젠 토토 시작 선언 섹션; 바르 차 A [64]; 바르 차 B [64]; Exec 젠 토토 END DELLARE SECTION; exec 젠 토토 insert invest_complex 값 ( '(1,1)', '(3,3)'); EXEC 젠 토토 선언 CUR1 커서는 선택 a, b에서 b, b에서 b; Exec 젠 토토 Open CUR1; 찾을 수 없을 때마다 Exec 젠 토토이 중단됩니다. 동안 (1) exec 젠 토토은 cur1에서 다음과 같이 가져옵니다 : a, : b; printf ( "a =%s, b =%s \ n", a.arr, b.arr); Exec 젠 토토 Clos Cur1;
이 예제는 다음과 같은 결과를 보여줍니다 :
a = (1,1), b = (3,3)
다른 해결 방법은 ECPG에서 사용자 정의 유형의 직접 사용을 피하고 대신 사용자 정의 유형과 ECPG가 처리 할 수있는 기본 유형을 변환하는 함수 또는 캐스트를 만듭니다. 그러나 이러한 유형의 캐스트, 특히 암시 적 캐스트는 유형 시스템에 매우 신중하게 도입되어야합니다.
예를 들어
CREATE CREATION_COMPLEX (R DOUBLE, I DOUBLE)는 복합체를 반환합니다 언어 젠 토토 불변 AS $$ $ 1 * complex '(1,0') ' + $ 2 * complex'(0,1) '$$;
이 정의 이후 다음
Exec 젠 토토 시작 선언 섹션; 이중 A, B, C, D; Exec 젠 토토 END DELLARE SECTION; a = 1; b = 2; C = 3; d = 4; exec 젠 토토 insert istes_complex 값 (create_complex (: a, : b), create_complex (: c, : d));
exec 젠 토토 insert invest_complex 값 ( '(1,2)', '(3,4)';
위의 예제는 널 값을 처리하지 않습니다. 실제로 검색 예제는 데이터베이스에서 널 값을 가져 오면 오류가 발생합니다. NULL 값을 데이터베이스로 전달하거나 데이터베이스에서 NULL 값을 검색하려면 데이터가 포함 된 각 호스트 변수에 대한 두 번째 호스트 변수 사양을 추가해야합니다. 이 두 번째 호스트 변수는라고합니다.표시기그리고 데이텀이 null인지 알려주는 플래그를 포함합니다.이 경우 실제 호스트 변수의 값은 무시됩니다. 다음은 널 값의 검색을 올바르게 처리하는 예입니다.
exec 젠 토토 시작 선언 섹션; varchar val; int val_ind; EXEC 젠 토토 종료 선언 섹션 : ... exec 젠 토토 선택 B로 : val : val_ind from test1;
지표 변수val_ind
값이 null이 아닌 경우 0이되며 값이 널이면 음수가됩니다. (보다PostgreSQL : 문서 : 개발 : 34.16. Oracle 호환성 토토 결과57149_57188
표시기에는 또 다른 기능이 있습니다. 표시기 값이 양수 인 경우 값이 널이 아니지만 호스트 변수에 저장 될 때 잘 렸습니다..
인수 인 경우-r no_indicator
사전 처리기에게 전달ECPG
에서 작동합니다“No-Indicator”모드. NO-Indicator 모드에서 표시기 변수가 지정되지 않으면 널 값이 비어있는 문자열로 문자열 유형에 대한 문자열 유형에 대한 신호 (입력 및 출력) 및 유형에 대한 최저 값 (예 :에 대한 정수 유형에 대한 신호를 나타냅니다.int_min
forint
).