inPostgre윈 토토 : 문서 : 17 : 34.3. 실행 윈 토토 명령임베디드 사설 토토 프로그램에서 사설 토토 문을 실행하는 방법을 보았습니다. 이러한 진술 중 일부는 고정 값 만 사용했으며 사용자가 제공 한 값을 명령문에 삽입하거나 프로그램이 쿼리에서 반환 한 값을 처리하도록하는 방법을 제공하지 않았습니다. 이러한 종류의 진술은 실제 응용 프로그램에서 실제로 유용하지 않습니다. 이 섹션은 C 프로그램과 내장 된 사설 토토 문들 사이에 데이터를 전달할 수있는 방법을 자세히 설명합니다.호스트 변수. 임베디드 사설 토토 프로그램에서는 사설 토토 문을 고려합니다.게스트C 프로그램 코드에서호스트 언어. 따라서 C 프로그램의 변수를라고합니다.호스트 변수.
Postgre사설 토토 백엔드와 ECPG 응용 프로그램 사이의 값을 교환하는 또 다른 방법은에 설명 된 사설 토토 디스크립터의 사용입니다.Postgre와이즈 토토 : 문서 : 17 : 34.7. 설명자 영역 사용.
C 프로그램과 사설 토토 문 사이의 데이터 전달은 내장 된 사설 토토에서 특히 간단합니다. 프로그램에 데이터를 표시하는 대신 값을 올바르게 인용하는 것과 같은 다양한 합병증을 수반하는 문장에 데이터를 붙여 넣는 대신 C 변수의 이름을 콜론에 의해 접두사에 표시 한 사설 토토 문에 작성할 수 있습니다. 예를 들어:
실행 가능한 값으로 삽입 (: 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
조항은 선택 목록과 사이에 나타납니다.From
절. 선택 목록의 요소 수와 다음 목록in
(대상 목록이라고도 함)는 동일해야합니다.
다음은 명령을 사용하는 예입니다Fetch
:
Exec 사설 토토 시작 선언 섹션; int v1; 바르 르 차 V2; Exec 사설 토토 END DELLARE SECTION; ... Exec 사설 토토 선택 A, B Test에서 FOO Cursor를 선언합니다. ... 하다 ... exec sql 다음은 foo에서 v1, : v2; ... 하는 동안 (...);
여기in
조항은 모든 정상 조항 후에 나타납니다.
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 |
짧은 |
Integer |
int |
bigint |
긴 긴 int |
Decimal |
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
및텍스트
, 호스트 변수를 선언하는 두 가지 가능한 방법이 있습니다.
한 가지 방법 사용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
종료 0 바이트를 포함하여 문자열을 호스팅합니다. 따라서 문자열을 a 저장하려면Varchar
호스트 변수, 호스트 변수는 제로 바이트 터미네이터를 포함한 길이로 선언해야합니다. 회원Len
에 저장된 문자열의 길이를 유지합니다.ARR
종료 제로 바이트없이. 호스트 변수가 쿼리의 입력으로 사용되는 경우, ifStrlen (ARR)
andLen
다르고 짧은 것이 사용됩니다.
Varchar
상류 또는 소문자로 작성할 수는 있지만 혼합 된 경우에는 없습니다.
char
andVarchar
호스트 변수는 다른 사설 토토 유형의 값을 보유 할 수 있으며,이 유형은 문자열 양식에 저장됩니다.
ECPG에는 Postgre사설 토토 서버의 일부 특수 데이터 유형과 쉽게 상호 작용하는 데 도움이되는 특수 유형이 포함되어 있습니다. 특히에 대한 지원을 구현했습니다.숫자
, Decimal
, 날짜
, 타임 스탬프
및간격
유형. 이러한 데이터 유형은 원시적 호스트 변수 유형에 유용하게 매핑 될 수 없습니다 (예 :int
, 긴 긴 int
또는char []
)는 복잡한 내부 구조를 가지고 있기 때문입니다. 응용 프로그램은 특수 유형의 호스트 변수를 선언하고 PGTypes 라이브러리에서 기능을 사용하여 액세스하여 이러한 유형을 처리합니다. pgtypes 라이브러리,에 자세히 설명 된배트맨 토토 PostgreSQL : 문서 : 17 : 34.6. PGTYPES 라이브러리예를 들어 타임 스탬프에 간격을 추가하기 위해 사설 토토 Server에 쿼리를 보낼 필요가 없도록 이러한 유형을 처리하는 기본 기능이 포함되어 있습니다.
다음 하위 섹션에서는 이러한 특수 데이터 유형을 설명합니다. PGTYPES 라이브러리 기능에 대한 자세한 내용은 참조하십시오.배트맨 토토 PostgreSQL : 문서 : 17 : 34.6. PGTYPES 라이브러리.
다음은 처리 패턴이 있습니다타임 스탬프
ECPG 호스트 응용 프로그램의 변수.
먼저, 프로그램에는의 헤더 파일을 포함해야합니다.타임 스탬프
유형 :
#include <pgtypes_timestamp.h
다음, 호스트 변수를 유형으로 선언타임 스탬프
선언 섹션 :
exec 사설 토토 시작 선언 섹션; 타임 스탬프 TS; EXEC 사설 토토 종료 선언 섹션;
그리고 호스트 변수에 값을 읽은 후 pgtypes 라이브러리 기능을 사용하여 처리하십시오. 다음 예에서타임 스탬프
값은 텍스트 (ASCII) 양식으로 변환됩니다pgtypestimestamp_to_asc ()
기능 :
exec sql select 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 : 문서 : 17 : 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;
숫자
and소수점
유형은와 유사합니다.간격
유형 : 포인터를 정의하고, 힙에 일부 메모리 공간을 할당하고, PGTypes 라이브러리 기능을 사용하여 변수에 액세스해야합니다. PGTYPES 라이브러리 기능에 대한 자세한 내용은 참조하십시오.배트맨 토토 PostgreSQL : 문서 : 17 : 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스포츠 토토 : 문서 : 17 : 34.5. 동적 스포츠 토토.)
inPostgre사설 토토v16 이전에 릴리스, typedef 이름으로 사설 토토 키워드를 사용하면 이름을 사설 토토 키워드로 사용하는 대신 TypEdef 자체 사용과 관련된 구문 오류가 발생할 수 있습니다. 새로운 동작은 기존 ECPG 응용 프로그램이 새로운 상태에서 재 컴파일 될 때 문제를 일으킬 가능성이 적습니다Postgre사설 토토새 키워드로 릴리스.
가장 일반적인 유형으로 포인터를 선언 할 수 있습니다. 그러나 포인터를 자동 할당없이 쿼리의 대상 변수로 사용할 수는 없습니다. 보다Postgre와이즈 토토 : 문서 : 17 : 34.7. 설명자 영역 사용자동 배치에 대한 자세한 내용은
Exec 사설 토토 시작 선언 섹션; int *intp; char ** charp; EXEC 사설 토토 종료 선언 섹션;
이 섹션에는 ECPG 애플리케이션에서 Nonscalar 및 사용자 정의 사설 토토 레벨 데이터 유형을 처리하는 방법에 대한 정보가 포함되어 있습니다. 이는 이전 섹션에서 설명한 비 프라이드 유형의 호스트 변수의 처리와는 다릅니다.
다차원 사설 토토 레벨 어레이는 ECPG에서 직접 지원되지 않습니다. 1 차원 사설 토토 레벨 어레이는 C 배열 호스트 변수에 매핑 될 수 있고 그 반대도 마찬가지입니다. 그러나 명령문을 작성할 때 ECPG는 열의 유형을 알지 못하므로 C 배열이 해당 사설 토토 레벨 어레이에 입력되는지 확인할 수 없습니다. 사설 토토 문의 출력을 처리 할 때 ECPG는 필요한 정보를 가지고 있으므로 두 배열인지 확인합니다.
쿼리에 액세스하는 경우요소배열의 개별적으로 ECPG에서 배열을 사용하지 않습니다. 그런 다음 요소 유형에 매핑 될 수있는 유형을 갖는 호스트 변수를 사용해야합니다. 예를 들어, 열 유형이 배열 인 경우Integer
, 유형의 호스트 변수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 : 문서 : 17 : 36.13. 사용자 정의 토토 캔. 해당 유형의 외부 문자열 표현은입니다.(%f,%f)
, 함수에 정의되어 있습니다complex_in ()
및complex_out ()
함수PostgreSQL : 문서 : 17 : 36.13. 사용자 정의 토토 캔. 다음 예제는 복잡한 유형 값을 삽입합니다(1,1)
and(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 function create_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 사설 토토 test_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 : 문서 : 17 : 34.16. Oracle 호환성 토토 사이트Oracle-Specific 행동을 활성화하려면)
표시기에는 또 다른 함수가 있습니다. 표시기 값이 양수 인 경우 값이 NULL이 아니지만 호스트 변수에 저장 될 때 잘 렸습니다..
인수 인 경우-r no_indicator
사전 처리기에게 전달ECPG
에서 작동합니다“no-Indicator”모드. No-Indicator 모드에서 표시기 변수가 지정되지 않으면 널 값이 비어있는 문자열로 문자열 유형에 대한 문자열 유형에 대한 신호 (입력 및 출력) 및 유형의 가장 낮은 값 (예 :에 대한 신호입니다.int_min
forint
).
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면