| Postgre토토 핫 9.2.24 문서 | ||||
|---|---|---|---|---|
| Postgre젠 토토 : 문서 : 9.2 : 젠 토토 명령 실행 | 토토 꽁 머니 : 문서 : 9.2 : ECPG- C에 포함 된 SQL | 33장.ECPG- 삽입됨토토 핫C에서 | 다음 | |
에Postgre젠 토토 : 문서 : 9.2 : 젠 토토 명령 실행당신은 어떻게 보았습니까? Embedded 토토 핫 프로그램에서 토토 핫문을 실행할 수 있습니다. 일부 그 진술 중 고정된 값만 사용했으며 사용자가 제공한 값을 명령문에 삽입하거나 프로그램은 쿼리에서 반환된 값을 처리합니다. 그런 종류의 문은 실제 응용 프로그램에서는 실제로 유용하지 않습니다. 이 섹션에서는 C 간에 데이터를 전달하는 방법을 자세히 설명합니다. 간단한 메커니즘을 사용하여 프로그램 및 내장 토토 핫 문 전화함호스트 변수. 임베디드에서는 우리가 토토 핫 문이라고 생각하는 토토 핫 프로그램은 다음과 같습니다.손님C 프로그램 코드에서호스트 언어. 따라서 변수 C 프로그램이 호출됩니다.호스트 변수.
Postgre토토 핫 백엔드와 Postgre토토 핫 백엔드 간에 값을 교환하는 또 다른 방법 ECPG 애플리케이션은 다음에 설명된 토토 핫 설명자를 사용합니다.503 범퍼카 토토 페치 실패.
C 프로그램과 토토 핫 문 사이에 데이터를 전달하는 것은 특히 임베디드 토토 핫에서는 간단합니다. 갖는 대신 프로그램은 데이터를 명령문에 붙여넣습니다. 값을 올바르게 인용하는 등의 다양한 문제로 인해 간단히 C 변수의 이름을 토토 핫에 쓸 수 있습니다. 콜론이 앞에 붙은 명령문입니다. 예를 들면:
EXEC 토토 핫 INSERT INTO sometable VALUES (:v1, 'foo', :v2);
이 명령문은 두 개의 C 변수를 참조합니다.v1그리고v2또한 다음을 사용합니다. 일반 토토 핫 문자열 리터럴. 한 종류의 데이터만 사용하도록 제한되어 있습니다.
토토 핫 문에 C 변수를 삽입하는 이 스타일이 작동합니다. 토토 핫에서 값 표현식이 필요한 모든 위치 진술.
예를 들어 프로그램에서 데이터베이스로 데이터를 전달하려면 쿼리의 매개변수로 사용하거나 데이터베이스에서 데이터를 전달하기 위해 프로그램으로 돌아가서, 의도된 C 변수 이 데이터가 포함되어 있으면 특별히 표시된 부분에 선언해야 합니다. 섹션을 포함하므로 Embedded 토토 핫 전처리기가 이를 인식하게 됩니다. 그들.
이 섹션은 다음으로 시작됩니다:
EXEC 토토 핫 시작 선언 섹션;
그리고 다음으로 끝납니다:
EXEC 토토 핫 END 선언 섹션;
이 줄 사이에는 일반 C 변수가 있어야 합니다. 다음과 같은 선언:
int x = 4; char foo[16], bar[16];
보시다시피 선택적으로 초기값을 할당할 수 있습니다 변수에. 변수의 범위는 다음에 의해 결정됩니다. 프로그램 내에서 선언 섹션의 위치입니다. 당신은 할 수 있습니다 또한 다음 구문을 사용하여 변수를 선언합니다. 암시적으로 선언 섹션을 생성합니다.
EXEC 토토 핫 int i = 4;
당신은 프로그램에 선언 섹션을 원하는 만큼 가질 수 있습니다 좋아요.
선언은 다음과 같이 출력 파일에도 반영됩니다. 일반 C 변수이므로 다시 선언할 필요가 없습니다. 토토 핫 명령에 사용되지 않는 변수는 다음과 같습니다. 일반적으로 이러한 특수 섹션 외부에서 선언됩니다.
구조체 또는 공용체의 정의도 나열되어야 합니다. 내부에선언섹션. 그렇지 않으면 전처리기는 이러한 유형을 처리할 수 없습니다. 정의를 알아라.
이제 당신은 당신이 생성한 데이터를 전달할 수 있습니다 토토 핫 명령으로 프로그래밍합니다. 하지만 어떻게 검색합니까? 쿼리 결과? 이를 위해 Embedded 토토 핫은 다음을 제공합니다. 일반적인 명령의 특별한 변형선택그리고가져오기. 이것들 명령에는 특별한 것이 있습니다.INTO절 검색된 값이 어떤 호스트 변수에 해당하는지 지정합니다. 에 저장됩니다.선택다음에 사용됩니다. 단일 행만 반환하는 쿼리 및가져오기여러 항목을 반환하는 쿼리에 사용됩니다. 행, 커서를 사용합니다.
다음은 예입니다:
/* * 다음 표를 가정합니다. * CREATE TABLE test1 (a int, b varchar(50)); */ EXEC 토토 핫 시작 선언 섹션; int v1; VARCHAR v2; EXEC 토토 핫 END 선언 섹션; ... EXEC 토토 핫 SELECT a, b INTO :v1, :v2 FROM 테스트;
그래서INTO절이 사이에 나타납니다. 선택 목록과발신절. 선택 목록과 그 이후 목록의 요소 수INTO(대상 목록이라고도 함) 동일해야 합니다.
다음은 명령을 사용하는 예입니다.가져오기:
EXEC 토토 핫 시작 선언 섹션;
int v1;
VARCHAR v2;
EXEC 토토 핫 END 선언 섹션;
...
EXEC 토토 핫 DECLARE foo CURSOR FOR SELECT a, b FROM 테스트;
...
하다
...
EXEC 토토 핫 FETCH NEXT FROM FROM INTO :v1, :v2;
...
동안 (...);
여기는INTO다음에 절이 나타남 모든 일반 조항.
ECPG 응용프로그램이 Postgre토토 핫 서버와 C 애플리케이션 등의 경우 서버에서 쿼리 결과를 가져오거나 토토 핫을 실행하는 중 입력 매개변수가 있는 명령문의 경우 값은 다음과 같아야 합니다. Postgre토토 핫 데이터 유형과 호스트 언어 간에 변환됨 변수 유형(구체적으로는 C 언어 데이터 유형). 중 하나 ECPG의 주요 포인트는 이를 자동으로 처리한다는 것입니다. 대부분의 경우.
이와 관련하여 두 가지 종류의 데이터 유형이 있습니다: 일부 간단한 Postgre토토 핫 데이터 유형(예:정수그리고텍스트, 읽을 수 있음 애플리케이션에서 직접 작성합니다. 기타 Postgre토토 핫 데이터 유형(예:)타임스탬프그리고숫자특수 명령어를 통해서만 접근 가능 라이브러리 기능; 참조섹션 33.4.4.2.
테이블 33-1어떤 Postgre토토 핫 데이터 유형이 어떤 유형에 해당하는지 보여줍니다. C 데이터 유형. 값을 보내거나 받고 싶을 때 Postgre토토 핫 데이터 유형이 주어지면 다음과 같은 C 변수를 선언해야 합니다. 선언 섹션에 해당 C 데이터 유형이 있습니다.
표 33-1. Postgre토토 핫 데이터 간 매핑 유형 및 C 변수 유형
| Postgre토토 핫 데이터 유형 | 호스트 변수 유형 |
|---|---|
| smallint | 짧은 |
| 정수 | int |
| 비긴트 | 긴 긴 정수 |
| 십진수 | 십진수[a] |
| 숫자 | 숫자[a] |
| 진짜 | 플로트 |
| 배정밀도 | 더블 |
| smallserial | 짧은 |
| 연재 | int |
| 큰 직렬 | 긴 긴 정수 |
| oid | 부호 없는 정수 |
| 문자(n), varchar(n), 텍스트 | 문자[n+1], VARCHAR[n+1][b] |
| 이름 | 문자[NAMEDATALEN] |
| 타임스탬프 | 타임스탬프[a] |
| 간격 | 간격[a] |
| 날짜 | 날짜[a] |
| 부울 | 부울[c] |
| 참고: a.이 유형은 특수 라이브러리 기능을 통해 액세스됩니다. 참조섹션 33.4.4.2. b.선언됨 에서ecpglib.h c.선언됨 에서ecpglib.h그렇지 않다면 네이티브 |
|
다음과 같은 토토 핫 문자열 데이터 유형을 처리하려면varchar그리고텍스트, 호스트를 선언하는 방법에는 두 가지가 있습니다 변수.
편도는 다음을 사용하고 있습니다문자[],의 배열문자은 가장 일반적인 방법입니다. C에서 문자 데이터를 처리합니다.
EXEC 토토 핫 시작 선언 섹션;
문자 문자열[50];
EXEC 토토 핫 END 선언 섹션;
길이는 스스로 관리해야 한다는 점에 유의하세요. 만약에 이 호스트 변수를 쿼리의 대상 변수로 사용합니다. 49자를 초과하는 문자열, 버퍼를 반환합니다. 오버플로가 발생합니다.
다른 방법은 다음을 사용하는 것입니다.VARCHARtype은 ECPG에서 제공하는 특수 유형입니다. 는 유형 배열에 대한 정의VARCHAR이름이 지정된 것으로 변환됩니다구조체용 모든 변수. 다음과 같은 선언:
VARCHAR 변수[180];
다음으로 변환됩니다:
struct varchar_var int len; 문자 arr[180]; 변수;
회원arr호스트 종료 0바이트를 포함하는 문자열입니다. 따라서, a의 문자열VARCHAR호스트 변수, 호스트 변수는 다음을 포함한 길이로 선언되어야 합니다. 0바이트 종결자. 회원len저장된 문자열의 길이를 보유합니다. 에서arr없이 0바이트를 종료합니다. 호스트 변수를 입력으로 사용하는 경우 쿼리의 경우, ifstrlen(arr)그리고len다를수록 짧습니다. 하나가 사용됩니다.
VARCHAR상위 또는 소문자이지만 대소문자를 혼합할 수는 없습니다.
문자그리고VARCHAR호스트 변수는 다음 값도 보유할 수 있습니다. 문자열에 저장될 다른 토토 핫 유형 양식.
ECPG에는 상호작용에 도움이 되는 몇 가지 특별한 유형이 포함되어 있습니다. Postgre토토 핫의 일부 특수 데이터 유형을 사용하여 쉽게 서버. 특히, 다음과 같은 지원을 구현했습니다.숫자, 십진수, 날짜, 타임스탬프, 그리고간격유형. 이러한 데이터 유형 기본 호스트 변수 유형에 유용하게 맵핑될 수 없습니다. (예:int, 긴 긴 정수, 또는문자[]), 왜냐면 그들은 복잡한 내부 구조를 가지고 있습니다. 응용 프로그램은 다음을 처리합니다. 특수 유형의 호스트 변수를 선언하여 이러한 유형을 pgtypes 라이브러리의 함수를 사용하여 액세스합니다. 는 pgtypes 라이브러리, 자세한 내용은섹션 33.6기본 기능이 포함되어 있습니다. 이러한 유형을 처리하기 위해 시간에 간격을 추가하기 위해 토토 핫 서버에 쿼리 예를 들어 스탬프입니다.
다음 하위 섹션에서는 이러한 특수 데이터 유형을 설명합니다. pgtypes 라이브러리 함수에 대한 자세한 내용은 다음을 참조하세요.토토 베이 PostgreSQL : 문서 : 9.2 : PGTYPES 라이브러리.
다음은 처리 패턴입니다타임스탬프ECPG 호스트의 변수 신청합니다.
먼저, 프로그램은 다음에 대한 헤더 파일을 포함해야 합니다.타임스탬프유형:
#include <pgtypes_timestamp.h
다음으로 호스트 변수를 유형으로 선언타임스탬프선언 섹션에서:
EXEC 토토 핫 시작 선언 섹션; 타임스탬프 TS; EXEC 토토 핫 END 선언 섹션;
그리고 호스트 변수로 값을 읽은 후,
pgtypes 라이브러리 함수를 사용하여 처리합니다. 다음에서
예를 들어,타임스탬프값은
다음을 사용하여 텍스트(ASCII) 형식으로 변환됩니다.PGTYPEStimestamp_to_asc()기능:
EXEC 토토 핫 SELECT now()::timestamp INTO :ts;
printf("ts = %s\n", PGTYPEStimestamp_to_asc(ts));
이 예는 다음과 같은 결과를 보여줍니다:
ts = 2010-06-27 18:03:56.949343
또한 DATE 유형은 동일한 방식으로 처리될 수 있습니다.
방법. 프로그램에는 다음이 포함되어야 합니다.pgtypes_date.h, 호스트 변수를 다음과 같이 선언합니다.
날짜 유형을 입력하고 DATE 값을 텍스트 형식으로 변환합니다.
사용 중PGTYPESdate_to_asc()함수. pgtypes 라이브러리에 대한 자세한 내용은
함수, 참조토토 베이 PostgreSQL.
다음의 처리간격유형 와도 비슷합니다.타임스탬프그리고날짜유형. 그러나 이는 필수입니다. 에 대한 메모리를 할당하려면간격값을 명시적으로 입력하세요. 즉, 기억공간은 변수는 힙 메모리가 아닌 힙 메모리에 할당되어야 합니다. 스택 메모리.
다음은 예제 프로그램입니다:
#include <stdio.h
#include <stdlib.h
#include <pgtypes_interval.h
정수
메인(공허)
EXEC 토토 핫 시작 선언 섹션;
간격 *in;
EXEC 토토 핫 END 선언 섹션;
EXEC 토토 핫 CONNECT TO testdb;
in = PGTYPESinterval_new();
EXEC 토토 핫 SELECT '1분'::간격 INTO :in;
printf("간격 = %s\n", PGTYPESinterval_to_asc(in));
PGTYPESinterval_free(in);
EXEC 토토 핫 커밋;
EXEC 토토 핫 모두 연결 해제;
0을 반환합니다.
처리숫자그리고십진수유형은 다음과 유사합니다.간격type: 다음을 정의해야 합니다. 포인터, 힙에 일부 메모리 공간 할당 pgtypes 라이브러리 함수를 사용하여 변수에 액세스합니다. pgtypes 라이브러리 함수에 대한 자세한 내용은 다음을 참조하세요.토토 베이 PostgreSQL : 문서 : 9.2 : PGTYPES 라이브러리.
특정 기능은 제공되지 않습니다.십진수유형. 애플리케이션은 다음과 같아야 합니다. 그것을 a로 변환하십시오.숫자변수 더 많은 작업을 수행하려면 pgtypes 라이브러리 함수를 사용하세요. 처리 중입니다.
다음은 프로그램 처리 예시입니다숫자그리고십진수유형 변수.
#include <stdio.h
#include <stdlib.h
#include <pgtypes_numeric.h
토토 핫ERROR가 중지될 때마다 EXEC 토토 핫;
정수
메인(공허)
EXEC 토토 핫 시작 선언 섹션;
숫자 *번호;
숫자 *num2;
십진수 *dec;
EXEC 토토 핫 END 선언 섹션;
EXEC 토토 핫 CONNECT TO testdb;
num = PGTYPESnumeric_new();
dec = PGTYPESdecimal_new();
EXEC 토토 핫 SELECT 12.345::numeric(4,2), 23.456::decimal(4,2) INTO :num, :dec;
printf("숫자 = %s\n", PGTYPESnumeric_to_asc(num, 0));
printf("숫자 = %s\n", PGTYPESnumeric_to_asc(num, 1));
printf("숫자 = %s\n", PGTYPESnumeric_to_asc(num, 2));
/* 소수를 숫자로 변환하여 소수 값을 표시합니다. */
num2 = PGTYPESnumeric_new();
PGTYPESnumeric_from_decimal(dec, num2);
printf("십진수 = %s\n", PGTYPESnumeric_to_asc(num2, 0));
printf("십진수 = %s\n", PGTYPESnumeric_to_asc(num2, 1));
printf("십진수 = %s\n", PGTYPESnumeric_to_asc(num2, 2));
PGTYPESnumeric_free(num2);
PGTYPESdecimal_free(dec);
PGTYPESnumeric_free(num);
EXEC 토토 핫 커밋;
EXEC 토토 핫 모두 연결 해제;
0을 반환합니다.
호스트 변수로 배열, 형식 정의, 구조체 및 포인터.
배열을 호스트 변수로 사용하는 경우에는 두 가지가 있습니다. 첫 번째는 텍스트 문자열을 저장하는 방법입니다.문자[]또는VARCHAR[], 에서 설명함섹션 33.4.4.1. 는 두 번째 사용 사례는 쿼리에서 여러 행을 검색하는 것입니다. 커서를 사용하지 않고 결과를 얻습니다. 배열 없이 처리하려면 여러 행으로 구성된 쿼리 결과가 필요합니다. 커서와를 사용하려면가져오기명령. 그러나 배열 호스트 변수를 사용하면 여러 행이 가능합니다. 한번에 받아보세요. 배열의 길이는 다음과 같아야 합니다. 모든 행을 수용할 수 있도록 정의됩니다. 그렇지 않으면 버퍼 오버플로가 발생할 가능성이 높습니다.
다음 예는 다음을 스캔합니다.pg_database시스템 테이블 및 모든 OID 표시 사용 가능한 데이터베이스의 이름:
정수
메인(공허)
EXEC 토토 핫 시작 선언 섹션;
int dbid[8];
char 데이터베이스 이름[8][16];
나는 int;
EXEC 토토 핫 END 선언 섹션;
memset(dbname, 0, sizeof(char)* 16 * 8);
memset(dbid, 0, sizeof(int) * 8);
EXEC 토토 핫 CONNECT TO testdb;
/* 한 번에 여러 행을 배열로 검색합니다. */
EXEC 토토 핫 SELECT oid,datname INTO :dbid, :dbname FROM pg_database;
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, DB 이름=템플릿0 oid=11511, DB 이름=postgres oid=313780, dbname=testdb oid=0, DB 이름= oid=0, DB 이름= oid=0, DB 이름=
구성원 이름이 다음의 열 이름과 일치하는 구조 쿼리 결과는 여러 열을 검색하는 데 사용할 수 있습니다. 한 번. 이 구조를 사용하면 여러 열 값을 처리할 수 있습니다. 단일 호스트 변수에서.
다음 예에서는 OID, 이름 및 크기를 검색합니다.
사용 가능한 데이터베이스 중pg_database시스템 테이블 및 사용pg_database_size()함수.
이 예에서는 구조 변수dbinfo_t이름이 각각 일치하는 구성원 포함
의 열선택결과는
여러 개를 넣지 않고 하나의 결과 행을 검색하는 데 사용됩니다.
의 호스트 변수가져오기진술.
EXEC 토토 핫 시작 선언 섹션;
typedef 구조체
int oid;
char 데이터이름[65];
긴 긴 정수 크기;
dbinfo_t;
dbinfo_t dbval;
EXEC 토토 핫 END 선언 섹션;
memset(&dbval, 0, sizeof(dbinfo_t));
EXEC 토토 핫 DECLARE cur1 CURSOR FOR SELECT oid, datname, pg_database_size(oid) AS size FROM pg_database;
EXEC 토토 핫 OPEN cur1;
/* 결과 집합의 끝에 도달하면 while 루프에서 빠져나옵니다 */
EXEC 토토 핫을 찾을 수 없을 때 중단하십시오.
동안 (1)
/* 여러 열을 하나의 구조로 가져옵니다. */
cur1 INTO에서 EXEC 토토 핫 가져오기 :dbval;
/* 구조체의 멤버를 인쇄합니다. */
printf("oid=%d, datname=%s, 크기=%lld\n", dbval.oid, dbval.datname, dbval.size);
EXEC 토토 핫 CLOSE cur1;
이 예는 다음 결과를 보여줍니다. (정확한 값은 현지 상황에 따라 다릅니다.)
oid=1, datname=template1, 크기=4324580 oid=11510, datname=template0, 크기=4243460 oid=11511, datname=postgres, 크기=4324580 oid=313780, datname=testdb, 크기=8183012
구조 호스트 변수"흡수"구조체만큼 많은 열 필드. 추가 열을 다른 호스트에 할당할 수 있습니다. 변수. 예를 들어, 위 프로그램은 다음과 같을 수도 있습니다. 다음과 같이 재구성되었습니다.크기구조 외부의 변수:
EXEC 토토 핫 시작 선언 섹션;
typedef 구조체
int oid;
char 데이터이름[65];
dbinfo_t;
dbinfo_t dbval;
긴 긴 정수 크기;
EXEC 토토 핫 END 선언 섹션;
memset(&dbval, 0, sizeof(dbinfo_t));
EXEC 토토 핫 DECLARE cur1 CURSOR FOR SELECT oid, datname, pg_database_size(oid) AS size FROM pg_database;
EXEC 토토 핫 OPEN cur1;
/* 결과 집합의 끝에 도달하면 while 루프에서 빠져나옵니다 */
EXEC 토토 핫을 찾을 수 없을 때 중단하십시오.
동안 (1)
/* 여러 열을 하나의 구조로 가져옵니다. */
cur1 INTO에서 EXEC 토토 핫 가져오기 :dbval, :size;
/* 구조체의 멤버를 인쇄합니다. */
printf("oid=%d, datname=%s, 크기=%lld\n", dbval.oid, dbval.datname, 크기);
EXEC 토토 핫 CLOSE cur1;
다음을 사용하세요typedef지도에 대한 키워드 기존 유형에 대한 새로운 유형입니다.
EXEC 토토 핫 시작 선언 섹션;
typedef char mychartype[40];
typedef long serial_t;
EXEC 토토 핫 END 선언 섹션;
또한 다음을 사용할 수도 있습니다.
EXEC 토토 핫 TYPE serial_t가 길다;
이 선언은 선언의 일부일 필요는 없습니다. 섹션.
당신은 가장 일반적인 유형에 대한 포인터를 선언할 수 있습니다. 참고 그러나 포인터를 대상 변수로 사용할 수는 없습니다. 자동 할당 없이 쿼리합니다. 참조섹션 33.7더 보기 자동 할당에 대한 정보입니다.
EXEC 토토 핫 시작 선언 섹션;
int *intp;
char **charp;
EXEC 토토 핫 END 선언 섹션;
이 섹션에는 비 스칼라를 처리하는 방법에 대한 정보가 포함되어 있습니다. ECPG 애플리케이션의 사용자 정의 토토 핫 수준 데이터 유형. 이는 호스트 변수를 처리하는 것과는 다릅니다. 이전 섹션에서 설명한 비원시 유형입니다.
다차원 토토 핫 수준 배열은 직접적으로 ECPG에서 지원됩니다. 1차원 토토 핫 수준 배열은 다음과 같습니다. C 배열 호스트 변수에 매핑되고 그 반대도 마찬가지입니다. 그러나, 명령문을 생성할 때 ecpg는 해당 유형을 알지 못합니다. 열에 C 배열이 입력되었는지 확인할 수 없도록 합니다. 해당 토토 핫 수준 배열. 출력을 처리할 때 토토 핫 문, ecpg에는 필요한 정보가 있으므로 둘 다 배열인지 확인합니다.
쿼리가 액세스하는 경우요소배열의 별도로 사용하면 ECPG에서 배열을 사용하지 않아도 됩니다. 그런 다음, 요소에 맵핑될 수 있는 유형의 호스트 변수 유형을 사용해야 합니다. 예를 들어 열 유형이 배열인 경우 의정수, 유형의 호스트 변수int사용할 수 있습니다. 또한 요소의 경우 유형은varchar또는텍스트, 유형의 호스트 변수문자[]또는VARCHAR[]될 수 있습니다 사용되었습니다.
여기에 예가 있습니다. 다음 표를 가정해 보겠습니다.
테이블 t3 생성(
ii 정수[]
);
testdb= SELECT * FROM t3;
ii
-------------
1,2,3,4,5
다음 예제 프로그램은 배열을 생성하고 이를 유형의 호스트 변수에 저장합니다.int:
EXEC 토토 핫 시작 선언 섹션;
정수 ii;
EXEC 토토 핫 END 선언 섹션;
EXEC 토토 핫 DECLARE cur1 SELECT ii[4] FROM t3에 대한 커서;
EXEC 토토 핫 OPEN cur1;
EXEC 토토 핫을 찾을 수 없을 때 중단하십시오.
동안 (1)
cur1 INTO에서 EXEC 토토 핫 가져오기 :ii ;
printf("ii=%d\n", ii);
EXEC 토토 핫 CLOSE cur1;
이 예는 다음 결과를 보여줍니다:
ii=4
여러 배열 요소를 다음의 여러 요소에 매핑하려면 배열형 호스트 변수는 배열 컬럼의 각 요소와 호스트 변수 배열의 각 요소를 관리해야 합니다. 예를 들어 별도로:
EXEC 토토 핫 시작 선언 섹션;
int ii_a[8];
EXEC 토토 핫 END 선언 섹션;
t3에서 SELECT ii[1], ii[2], ii[3], ii[4]에 대한 EXEC 토토 핫 DECLARE cur1 커서;
EXEC 토토 핫 OPEN cur1;
EXEC 토토 핫을 찾을 수 없을 때 중단하십시오.
동안 (1)
cur1 INTO에서 EXEC 토토 핫 가져오기 :ii_a[0], :ii_a[1], :ii_a[2], :ii_a[3];
...
다시 한번 참고하세요
EXEC 토토 핫 시작 선언 섹션;
int ii_a[8];
EXEC 토토 핫 END 선언 섹션;
EXEC 토토 핫 DECLARE cur1 커서 선택 ii FROM t3;
EXEC 토토 핫 OPEN cur1;
EXEC 토토 핫을 찾을 수 없을 때 중단하십시오.
동안 (1)
/* 틀렸음 */
cur1 INTO에서 EXEC 토토 핫 가져오기 :ii_a;
...
이 경우에는 제대로 작동하지 않을 것입니다. 배열 유형 열을 배열 호스트 변수에 맵핑 직접.
또 다른 해결 방법은 배열을 외부에 저장하는 것입니다. 유형의 호스트 변수의 문자열 표현문자[]또는VARCHAR[]. 에 대한 이 표현에 대한 자세한 내용은 참조섹션 8.15.2. 참고하세요 이는 배열이 자연스럽게 배열로 액세스될 수 없음을 의미합니다. 호스트 프로그램에서(파싱하는 추가 처리 없이) 텍스트 표현).
복합 유형은 ECPG에서 직접 지원되지 않지만 쉬운 해결이 가능합니다. 사용 가능한 해결 방법은 다음과 같습니다. 위의 배열에 대해 설명한 것과 유사합니다. 각 속성을 별도로 사용하거나 외부 문자열을 사용하세요. 표현.
다음 예에서는 다음 유형을 가정하고 테이블:
CREATE TYPE comp_t AS (intval 정수, textval varchar(32)); CREATE TABLE t4 (compval comp_t); t4 값에 삽입( (256, 'Postgre토토 핫') );
가장 확실한 해결책은 각 속성에 액세스하는 것입니다 별도로. 다음 프로그램은 유형의 각 속성을 선택하여 예시 테이블comp_t개별적으로:
EXEC 토토 핫 시작 선언 섹션;
int 간격;
varchar 텍스트값[33];
EXEC 토토 핫 END 선언 섹션;
/* 복합 유형 열의 각 요소를 SELECT 목록에 넣습니다. */
EXEC 토토 핫 DECLARE cur1 CURSOR FOR SELECT (compval).intval, (compval).textval FROM t4;
EXEC 토토 핫 OPEN cur1;
EXEC 토토 핫을 찾을 수 없을 때 중단하십시오.
동안 (1)
/* 복합 유형 열의 각 요소를 호스트 변수로 페치합니다. */
cur1 INTO에서 EXEC 토토 핫 가져오기 :intval, :textval;
printf("intval=%d, textval=%s\n", intval, textval.arr);
EXEC 토토 핫 CLOSE cur1;
이 예를 향상시키기 위해 저장할 호스트 변수는 의 값가져오기명령은 다음과 같습니다. 하나의 구조로 모였습니다. 호스트에 대한 자세한 내용은 구조 형식의 변수는 참조섹션 33.4.4.3.2. 구조로 전환하려면 예제를 참조하세요. 아래와 같이 수정됩니다. 두 개의 호스트 변수,intval그리고textval, 의 회원이 되십시오.comp_t구조이며 구조는에 지정됩니다.가져오기명령.
EXEC 토토 핫 시작 선언 섹션;
typedef 구조체
int 간격;
varchar 텍스트값[33];
comp_t;
comp_t compval;
EXEC 토토 핫 END 선언 섹션;
/* 복합 유형 열의 각 요소를 SELECT 목록에 넣습니다. */
EXEC 토토 핫 DECLARE cur1 CURSOR FOR SELECT (compval).intval, (compval).textval FROM t4;
EXEC 토토 핫 OPEN cur1;
EXEC 토토 핫을 찾을 수 없을 때 중단하십시오.
동안 (1)
/* SELECT 목록의 모든 값을 하나의 구조에 넣습니다. */
cur1 INTO에서 EXEC 토토 핫 가져오기 :compval;
printf("intval=%d, textval=%s\n", compval.intval, compval.textval.arr);
EXEC 토토 핫 CLOSE cur1;
구조가 다음에서 사용되지만가져오기명령, 다음의 속성 이름SELECT절은 다음에 의해 하나씩 지정됩니다. 하나. 이는 다음을 사용하여 향상될 수 있습니다.*복합체의 모든 속성을 요청합니다. 값을 입력하세요.
...
EXEC 토토 핫 DECLARE cur1 CURSOR FOR SELECT(compval).* FROM t4;
EXEC 토토 핫 OPEN cur1;
EXEC 토토 핫을 찾을 수 없을 때 중단하십시오.
동안 (1)
/* SELECT 목록의 모든 값을 하나의 구조에 넣습니다. */
cur1 INTO에서 EXEC 토토 핫 가져오기 :compval;
printf("intval=%d, textval=%s\n", compval.intval, compval.textval.arr);
이 방법으로 복합 유형을 구조에 매핑할 수 있습니다. ECPG가 이해하지 못하더라도 거의 원활하게 복합 유형 자체.
마지막으로 복합 유형을 저장하는 것도 가능합니다 호스트의 외부 문자열 표현 값 유형의 변수문자[]또는VARCHAR[]. 그런데 그렇게 되기가 쉽지 않죠 호스트에서 값의 필드에 액세스 가능 프로그램.
새로운 사용자 정의 기본 유형은 에서 직접 지원되지 않습니다. 심전도. 외부 문자열 표현과 호스트를 사용할 수 있습니다. 유형의 변수문자[]또는VARCHAR[], 이 솔루션은 실제로 다양한 유형에 적합하고 충분합니다.
다음은 데이터 유형을 사용하는 예입니다.복잡한다음 예에서섹션 35.11. 외부 문자열
해당 유형의 표현은 다음과 같습니다.(%lf,%lf), 함수에 정의됨복합체_인()그리고complex_out()함수섹션 35.11. 다음 예
복합 유형 값을 삽입합니다.(1,1)그리고(3,3)으로
열a그리고b, 다음 표에서 선택하세요.
그거.
EXEC 토토 핫 시작 선언 섹션;
varchar a[64];
varchar b[64];
EXEC 토토 핫 END 선언 섹션;
EXEC 토토 핫 INSERT INTO test_complex VALUES ('(1,1)', '(3,3)');
EXEC 토토 핫 DECLARE cur1 CURSOR FOR SELECT a, b FROM test_complex;
EXEC 토토 핫 OPEN cur1;
EXEC 토토 핫을 찾을 수 없을 때 중단하십시오.
동안 (1)
cur1 INTO에서 EXEC 토토 핫 가져오기 :a, :b;
printf("a=%s, b=%s\n", a.arr, b.arr);
EXEC 토토 핫 CLOSE cur1;
이 예는 다음 결과를 보여줍니다:
a=(1,1), b=(3,3)
또 다른 해결 방법은 ECPG에서 사용자 정의 유형을 사용하고 대신 함수를 생성하거나 사용자 정의 유형과 유형 사이를 변환하는 캐스트 ECPG가 처리할 수 있는 기본 유형입니다. 그러나 그 유형에 유의하십시오. 캐스트, 특히 암시적 캐스트를 도입해야 합니다. 유형 시스템을 매우 신중하게 사용하세요.
예를 들어,
CREATE FUNCTION create_complex(r double, i double) RETURNS complex 언어 토토 핫 불변 AS $$ SELECT $1 * 복소수 '(1,0')' + $2 * 복소수 '(0,1)' $$;
이 정의 이후에는 다음과 같습니다
EXEC 토토 핫 시작 선언 섹션; 더블 a, b, c, d; EXEC 토토 핫 END 선언 섹션; a = 1; b = 2; c = 3; d = 4; EXEC 토토 핫 INSERT INTO test_complex VALUES (create_complex(:a, :b), create_complex(:c, :d));
와 같은 효과가 있습니다
EXEC 토토 핫 INSERT INTO test_complex VALUES ('(1,2)', '(3,4)');
위의 예는 null 값을 처리하지 않습니다. 실제로, 검색 예제에서는 null을 가져오면 오류가 발생합니다. 데이터베이스의 값입니다. null 값을 전달할 수 있으려면 데이터베이스를 사용하거나 데이터베이스에서 null 값을 검색하려면 다음을 수행해야 합니다. 각 호스트에 두 번째 호스트 변수 지정을 추가합니다. 데이터가 포함된 변수입니다. 이 두 번째 호스트 변수는 라고지시자그리고 다음을 포함합니다 데이터가 null인지 여부를 알려주는 플래그입니다. 실제 호스트 변수의 값은 무시됩니다. 여기에 예가 있습니다. null 값 검색을 올바르게 처리하는 방법:
EXEC 토토 핫 시작 선언 섹션; VARCHAR 발; int val_ind; EXEC 토토 핫 끝 선언 섹션: ... EXEC 토토 핫 SELECT b INTO :val :val_ind FROM test1;
표시변수val_ind할 것이다 값이 null이 아니면 0이고, 다음과 같으면 음수가 됩니다. 값이 null이었습니다.
표시에는 또 다른 기능이 있습니다: 표시 값이 양수이면 값이 null이 아니지만 null이었음을 의미합니다. 호스트 변수에 저장될 때 잘렸습니다.
인수인 경우-r no_indicator이다 전처리기에 전달됨ecpg, 그거 에서 근무함"표시 없음"모드. 에서 표시자 없음 모드, 표시자 변수가 지정되지 않은 경우 null 문자열에 대해 값이 신호로 표시됩니다(입력 및 출력 시). 유형은 빈 문자열이고 정수 유형의 경우 가장 낮은 유형입니다. 유형에 가능한 값(예:INT_MINforint).