Postgresql 9.2.24 문서 | ||||
---|---|---|---|---|
Postgre젠 토토 : 문서 : 9.2 : 젠 토토 명령 실행 | 토토 꽁 머니 : 문서 : 9.2 : ECPG- C에 포함 된 SQL | 33 장ECPG- 임베디드토토 핫in c | 다음 |
inPostgre젠 토토 : 문서 : 9.2 : 젠 토토 명령 실행당신은 방법을 보았습니다 임베디드 토토 핫 프로그램에서 토토 핫 문을 실행할 수 있습니다. 일부 해당 진술 중 고정 값 만 사용했으며 사용자가 제공 한 값을 명령문에 삽입하거나 프로그램 프로세스 쿼리에 의해 리턴 된 값. 그런 종류 진술은 실제 응용 프로그램에서 실제로 유용하지 않습니다. 이것 섹션은 C 사이에 데이터를 전달할 수있는 방법에 대해 자세히 설명합니다. 간단한 메커니즘을 사용한 프로그램 및 임베디드 토토 핫 문 라고 불리는호토토 핫 변수. 임베디드에서 토토 핫 프로그램 우리는 토토 핫 문을 고려합니다손님C 프로그램 코드에서호토토 핫 언어. 따라서 변수 C 프로그램 중호토토 핫 변수.
Postgre토토 핫 백엔드 사이의 값을 교환하는 또 다른 방법 ECPG 응용 프로그램은에 설명 된 토토 핫 디스크립터의 사용입니다.503 범퍼카 토토 핫 페치 실패.
C 프로그램과 토토 핫 문 사이의 데이터 전달은 다음과 같습니다. 임베디드 토토 핫에서 특히 간단합니다. 대신 프로그램을 수반하는 진술에 데이터를 붙여 넣습니다 가치를 올바르게 인용하는 것과 같은 다양한 합병증 단순히 C 변수의 이름을 토토 핫에 쓸 수 있습니다. 결장에 의해 접두사 인 진술. 예를 들어:
Exec 토토 핫 insert initeable 값 (: v1, 'foo', : v2);
이 진술은 이름라는 두 개의 c 변수를 나타냅니다.v1andv2당신이 한 종류의 데이터 또는 다른 데이터를 사용하도록 제한됩니다.
토토 핫 문에 C 변수를 삽입하는이 스타일 토토 핫에서 값 표현이 예상되는 곳 성명.
예를 들어 프로그램에서 데이터를 데이터베이스로 전달하려면 쿼리의 매개 변수로 또는 데이터베이스에서 데이터를 전달합니다. 프로그램으로 돌아가서 의도 된 C 변수 이 데이터를 포함하여 특별히 표시된 것으로 선언해야합니다. 섹션, 그래서 내장 된 토토 핫 사전 처리기는 그들을.
이 섹션은 :부터 시작합니다.
Exec 토토 핫 시작 선언 섹션;
exec 토토 핫 종료 선언 섹션;
해당 라인 사이에 일반 C 변수가 있어야합니다 다음과 같은 선언
int x = 4; Char Foo [16], Bar [16];
보시다시피, 초기 값을 선택적으로 할당 할 수 있습니다. 변수에. 변수의 범위는 프로그램 내에서 선언 섹션의 위치. 당신은 할 수 있습니다 또한 다음 구문으로 변수를 선언합니다 암시 적으로 선언 섹션을 생성합니다.
exec 토토 핫 int i = 4;
당신은 프로그램에 많은 선언 섹션을 가질 수 있습니다. 좋다.
선언은 또한 출력 파일에 반영됩니다. 정상적인 C 변수이므로 다시 선언 할 필요가 없습니다. 토토 핫 명령에 사용되지 않는 변수는 이 특별 섹션 밖에서 정상적으로 선언됩니다.
구조 또는 조합의 정의도 나열되어야합니다. 내부선언섹션. 그렇지 않으면 사전 처리기는 이러한 유형을 처리 할 수 없습니다. 정의를 알고 있습니다.
이제 귀하는 귀하가 생성 한 데이터를 전달할 수 있어야합니다. 토토 핫 명령으로 프로그램. 그러나 당신은 어떻게 검색합니까? 쿼리 결과? 이를 위해 임베디드 토토 핫이 제공합니다 일반적인 명령의 특수 변형selectandfetch. 이것들 명령에는 특별한in절 검색 된 값이 저장해야합니다.selecta 단일 행만 반환하는 쿼리,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토토 핫 Server 및 예 : 언제와 같은 C 응용 프로그램 서버에서 쿼리 결과를 검색하거나 토토 핫을 실행합니다 입력 매개 변수가있는 문서, 값은 필요합니다 Postgre토토 핫 데이터 유형과 호토토 핫 언어로 변환됩니다 가변 유형 (C 언어 데이터 유형, 구체적으로). 중 하나 ECPG의 주요 요점은 이것을 자동으로 처리한다는 것입니다. 대부분의 경우.
이와 관련하여 두 가지 종류의 데이터 유형이 있습니다. 와 같은 간단한 Postgre토토 핫 데이터 유형Integerand텍토토 핫를 읽을 수 있습니다 응용 프로그램에 의해 직접 작성됩니다. 다른 Postgre토토 핫 데이터 와 같은 유형타임 스탬프and숫자Special을 통해서만 액세스 할 수 있습니다 도서관 기능; 보다섹션 33.4.4.2.
테이블 33-1어떤 Postgre토토 핫 데이터 유형이 어느 것에 해당하는지 보여줍니다 C 데이터 유형. 값을 보내거나 받기를 원할 때 Postgre토토 핫 데이터 유형이 주어지면 C 변수를 선언해야합니다. 선언 섹션의 해당 C 데이터 유형.
표 33-1. Postgre토토 핫 데이터 간의 매핑 유형 및 C 변수 유형
Postgre토토 핫 데이터 유형 | 호토토 핫 변수 유형 |
---|---|
smallint | 짧은 |
정수 | int |
bigint | 긴 긴 int |
Decimal | Decimal[a] |
숫자 | 숫자[a] |
Real | float |
이중 정밀 | 더블 |
SmallSerial | 짧은 |
Serial | int |
bigserial | 긴 긴 int |
OID | 서명되지 않은 int |
캐릭터 (n), varchar (n), 텍토토 핫 | char [n+1], Varchar [n+1][B] |
이름 | char [namedatalen] |
타임 스탬프 | 타임 스탬프[a] |
간격 | 간격[a] |
날짜 | 날짜[a] |
부울 | bool[C] |
참고 : a.이 유형 만 가능합니다 특수 라이브러리 기능을 통해 액세스; 보다섹션 33.4.4.2. b.선언 안에ecpglib.h c.선언 안에ecpglib.h그렇지 않은 경우 토종의 |
토토 핫 문자열 데이터 유형을 처리하려면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종료 제로 바이트를 포함한 문자열. 따라서 저장하려면 a a 문자열Varchar호토토 핫 변수, 호토토 핫 변수는 다음을 포함하여 길이로 선언해야합니다. 제로 바이트 터미네이터. 회원Len저장된 문자열의 길이를 유지합니다 에서ARR제로 바이트 종단. 호토토 핫 변수가 입력으로 사용되는 경우 쿼리의 경우Strlen (ARR)andLen다르고 짧습니다 하나는 사용됩니다.
Varchar상단 또는 소문자이지만 혼합 된 경우는 아닙니다.
char및Varchar호토토 핫 변수도 값을 보유 할 수도 있습니다 다른 토토 핫 유형은 문자열에 저장됩니다. 양식.
ECPG는 상호 작용하는 데 도움이되는 몇 가지 특수 유형이 포함되어 있습니다. Postgre토토 핫의 일부 특수 데이터 유형으로 쉽게 쉽게 섬기는 사람. 특히에 대한 지원을 구현했습니다.숫자, 소수점, 날짜, 타임 스탬프, 그리고간격유형. 이러한 데이터 유형 원시 호토토 핫 가변 유형에 유용하게 매핑 될 수 없습니다 (와 같은int, 길다 긴 int또는char []) 복잡한 내부 구조가 있습니다. 응용 프로그램은 처리합니다 호토토 핫 변수를 특수 유형으로 선언하여 이러한 유형 PGTYPES 라이브러리에서 기능을 사용하여 액세스합니다. 그만큼 pgtypes 라이브러리,에 자세히 설명섹션 33.6기본 함수를 포함합니다 이러한 유형을 처리하려면 시간에 간격을 추가하기 위해 토토 핫 Server에 대한 쿼리 예를 들어 스탬프.
다음 하위 섹션에서는 이러한 특수 데이터 유형을 설명합니다. PGTYPES 라이브러리 기능에 대한 자세한 내용은 참조하십시오.토토 베이 Postgre토토 핫 : 문서 : 9.2 : 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 :.
간격타입 또한와 유사합니다.타임 스탬프and날짜유형. 그러나 필요합니다. 메모리를 할당하려면간격명시 적으로 값을 입력하십시오. 다시 말해, 메모리 공간 변수는 힙 메모리에 할당되어야합니다. 스택 메모리
여기 예제 프로그램이 있습니다 :
#include <stdio.h #include <stdlib.h #include <pgtypes_interval.h int 메인 (void) Exec 토토 핫 시작 선언 섹션; 간격 *in; Exec 토토 핫 END DELLARE SECTION; exec sql testdb에 연결; in = pgtypesinterval_new (); Exec 토토 핫 선택 '1 분':: 간격 : in; printf ( "interval = %s \ n", pgtypesinterval_to_asc (in)); pgtypesinterval_free (in); Exec 토토 핫 커밋; Exec 토토 핫 모든 분리; 반환 0;
숫자andDecimal유형은와 유사합니다.간격유형 : 정의가 필요합니다 포인터, 힙에 일부 메모리 공간을 할당하고 PGTYPES 라이브러리 기능을 사용하여 변수에 액세스합니다. PGTYPES 라이브러리 기능에 대한 자세한 내용은 참조하십시오.토토 베이 Postgre토토 핫 : 문서 : 9.2 : PGTYPES 라이브러리.
기능은 특별히 제공되지 않습니다Decimal타입. 응용 프로그램이 필요합니다 로 변환숫자변수 PGTYPES 라이브러리 기능을 사용하여 추가로 수행합니다 처리.
여기 예제 프로그램 취급숫자andDecimal타입 변수.
#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에 연결; 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;
호토토 핫 변수로서 배열, typedefs, 스트러크와 포인터.
호토토 핫 변수로 배열에 대한 두 가지 사용 사례가 있습니다. 첫 번째는 텍토토 핫 문자열을 저장하는 방법입니다.char []또는varchar [], AS 설명섹션 33.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 토토 핫 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
구조 호토토 핫 변수"흡수"구조만큼 많은 열 전지. 추가 열을 다른 호토토 핫에 할당 할 수 있습니다 변수. 예를 들어, 위의 프로그램도 가능합니다 이와 같이 재구성,크기구조 외부의 변수 :
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는 길다;
이 선언은 선언의 일부일 필요는 없습니다. 부분.
가장 일반적인 유형으로 포인터를 선언 할 수 있습니다. 메모 그러나 포인터를 대상 변수로 사용할 수는 없습니다. 자동 할당없이 쿼리. 보다섹션 33.7더 많은 경우 자동 할당에 관한 정보.
Exec 토토 핫 시작 선언 섹션; int *intp; char ** charp; EXEC 토토 핫 종료 선언 섹션;
이 섹션에는 Nonscalar를 처리하는 방법에 대한 정보가 포함되어 있습니다 ECPG 애플리케이션에서 사용자 정의 토토 핫 레벨 데이터 유형. 이것은 호토토 핫 변수의 처리와는 다릅니다. 이전 섹션에 설명 된 비 프리맨 유형의.
다차원 토토 핫 레벨 어레이는 직접적이지 않습니다 ECPG에서 지원됩니다. 1 차원 토토 핫 레벨 배열 일 수 있습니다 C 배열 호토토 핫 변수에 매핑되고 그 반대도 마찬가지입니다. 하지만, 진술을 작성할 때 ECPG는 C 열, 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 유형 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명령이 될 수 있습니다 하나의 구조로 모였습니다. 호토토 핫에 대한 자세한 내용은 구조 양식의 변수, 참조섹션 33.4.4.3.2. 구조로 전환하려면 예제가 할 수 있습니다 아래와 같이 수정됩니다. 두 호토토 핫 변수intvalandTextVal, 의 구성원이 되십시오.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 [], 그리고이 솔루션은 실제로입니다 많은 유형에 적합하고 충분합니다.
여기 데이터 유형을 사용하는 예입니다복잡한예제에서섹션 35.11. 외부 문자열
그 유형의 표현은(%lf,%lf), 함수에 정의되어 있습니다complex_in ()
및complex_out ()
함수섹션 35.11. 다음 예
복잡한 유형 값 삽입(1,1)및(3,3)로
열aandB, 후 테이블에서 선택하십시오
저것.
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에서 사용자 정의 유형과 대신 기능을 작성하거나 사용자 정의 유형과 a를 변환하는 캐스트 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 값을 검색하려면 각 호스트에 두 번째 호토토 핫 변수 사양을 추가하십시오 데이터를 포함하는 변수. 이 두 번째 호토토 핫 변수입니다 호출표시기a 데이텀이 무효인지를 알려주는 플래그,이 경우 실제 호토토 핫 변수의 값은 무시됩니다. 여기 예입니다 널 값의 검색을 올바르게 처리합니다.
Exec 토토 핫 시작 선언 섹션; varchar val; int val_ind; EXEC 토토 핫 종료 선언 섹션 : ... exec 토토 핫 선택 B로 : val : val_ind from test1;
지표 변수val_ind의지 값이 무효가되지 않으면 0이되면 음수가됩니다. 그 값은 널이었다.
표시기에는 또 다른 기능이 있습니다 긍정적이므로 값이 무효가 아니라는 것을 의미하지만 호토토 핫 변수에 저장되었을 때 잘 렸습니다.
인수 인 경우-r no_indicatorIS 전처리 자에게 전달ECPG, It 작업"No-Indicator"모드. ~ 안에 인디케이트 없음 모드, 표시기 변수가 지정되지 않은 경우 NULL 값은 문자열에 대한 신호 (입력 및 출력) 빈 문자열로 유형 및 정수 유형에 대해 가장 낮은 유형 유형에 대한 가능한 값 (예 :int_minforint).