| Postgre롤 토토 9.3.25 문서 | ||||
|---|---|---|---|---|
| Postgre범퍼카 토토 : 문서 : 9.3 : 실행 실행 | 젠 토토 : 문서 : 9.3 : ECPG- C에 포함 된 SQL | 33장.ECPG- 삽입됨롤 토토C에서 | 다음 | |
에Postgre범퍼카 토토 : 문서 : 9.3 : 실행 실행너는 네가 어떻게 했는지 봤지 Embedded 롤 토토 프로그램에서 롤 토토문을 실행할 수 있습니다. 일부 이러한 진술은 고정된 값만 사용했으며 방법을 제공하지 않았습니다. 사용자 제공 값을 명령문에 삽입하거나 프로그램에 쿼리에서 반환된 값을 처리합니다. 그런 발언들 실제 응용 프로그램에서는 실제로 유용하지 않습니다. 이 섹션에서는 설명합니다. C 프로그램과 C 프로그램 간에 데이터를 전달하는 방법에 대해 자세히 설명합니다. 라는 간단한 메커니즘을 사용하는 삽입된 롤 토토 문호스트 변수. Embedded 롤 토토 프로그램에서 우리는 롤 토토 문을 다음과 같이 고려하십시오.손님C 프로그램 코드에서호스트 언어. 따라서 C 프로그램의 변수가 호출됩니다.호스트 변수.
Postgre롤 토토 백엔드와 Postgre롤 토토 백엔드 간에 값을 교환하는 또 다른 방법 ECPG 애플리케이션은 다음에 설명된 롤 토토 설명자를 사용합니다.PostgreSQL : 문서 : 9.3 : 설명 자 스포츠 토토 베트맨 사용.
C 프로그램과 롤 토토 문 사이에 데이터를 전달하는 것은 특히 임베디드 롤 토토에서는 간단합니다. 프로그램을 가지고 있는 것보다 다양한 내용을 수반하는 명세서에 데이터를 붙여 넣습니다. 값을 올바르게 인용하는 것과 같은 복잡한 문제는 간단히 해결할 수 있습니다. C 변수의 이름을 롤 토토 문에 쓰고, 접두사는 다음과 같습니다. 콜론. 예를 들면:
EXEC 롤 토토 INSERT INTO sometable VALUES (:v1, 'foo', :v2);
이 명령문은 두 개의 C 변수를 참조합니다.v1그리고v2또한 일반 롤 토토 문자열 리터럴(귀하가 그렇지 않음을 설명하기 위해) 한 종류의 데이터만 사용하도록 제한되어 있습니다.
롤 토토 문에 C 변수를 삽입하는 이 스타일이 작동합니다. 롤 토토 문에서 값 식이 필요한 모든 위치에 있습니다.
예를 들어 다음과 같이 프로그램에서 데이터베이스로 데이터를 전달하려면 쿼리의 매개변수를 사용하거나 데이터베이스의 데이터를 다시 프로그램, 이 데이터를 포함하도록 의도된 C 변수 특별히 표시된 섹션에 선언해야 하므로 포함된 롤 토토 전처리기가 이를 인식합니다.
이 섹션은 다음으로 시작됩니다:
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자를 초과하는 문자열을 반환하면 버퍼 오버플로가 발생합니다. 발생합니다.
다른 방법은 다음을 사용하는 것입니다.VARCHAR유형, 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 라이브러리에 대한 자세한 내용은와이즈 토토 PostgreSQL : 문서 : 9.3 : PGTYPES 라이브러리기본 포함 이러한 유형을 처리하는 기능이 있으므로 간격을 추가하기 위해 롤 토토 서버에 쿼리를 보냅니다. 예를 들어 타임스탬프입니다.
다음 하위 섹션에서는 이러한 특수 데이터 유형을 설명합니다. 에 대한 pgtypes 라이브러리 함수에 대한 자세한 내용은 참조섹션 33.6.
다음은 처리 패턴입니다타임스탬프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 라이브러리 함수에 대해서는 참조섹션 33.6.
처리간격유형도 다음과 같습니다. 와 비슷하다타임스탬프그리고날짜유형. 하지만 메모리 할당은 필수입니다. 한 동안간격값을 명시적으로 입력하세요. 에서 즉, 변수에 대한 메모리 공간을 할당해야 합니다. 스택 메모리가 아닌 힙 메모리에 있습니다.
다음은 예제 프로그램입니다:
#include <stdio.h
#include <stdlib.h
#include <pgtypes_interval.h
정수
메인(공허)
EXEC 롤 토토 시작 선언 섹션;
간격 *in;
EXEC 롤 토토 END 선언 섹션;
EXEC 롤 토토 CONNECT TO testdb;
EXEC 롤 토토 SELECT pg_catalog.set_config('search_path', '', false); EXEC 롤 토토 커밋;
in = PGTYPESinterval_new();
EXEC 롤 토토 SELECT '1분'::간격 INTO :in;
printf("간격 = %s\n", PGTYPESinterval_to_asc(in));
PGTYPESinterval_free(in);
EXEC 롤 토토 커밋;
EXEC 롤 토토 모두 연결 해제;
0을 반환합니다.처리숫자그리고십진수유형은 다음과 유사합니다.간격type: 포인터 정의가 필요합니다. 힙에 일부 메모리 공간을 할당하고 pgtypes 라이브러리 함수를 사용하는 변수. 자세한 내용은 pgtypes 라이브러리 함수에 대해서는 참조섹션 33.6.
특정 기능은 제공되지 않습니다.십진수유형. 애플리케이션은 이를 a로 변환해야 합니다.숫자pgtypes 라이브러리를 사용하는 변수 추가 처리를 수행하는 함수입니다.
다음은 프로그램 처리 예시입니다숫자그리고십진수유형 변수.
#include <stdio.h
#include <stdlib.h
#include <pgtypes_numeric.h
롤 토토ERROR가 중지될 때마다 EXEC 롤 토토;
정수
메인(공허)
EXEC 롤 토토 시작 선언 섹션;
숫자 *번호;
숫자 *num2;
십진수 *dec;
EXEC 롤 토토 END 선언 섹션;
EXEC 롤 토토 CONNECT TO testdb;
EXEC 롤 토토 SELECT 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) 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 pg_catalog.set_config('search_path', '', false); EXEC 롤 토토 커밋;
/* 한 번에 여러 행을 배열로 검색합니다. */
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가 길다;
이 선언은 선언의 일부일 필요는 없습니다. 섹션.
가장 일반적인 유형에 대한 포인터를 선언할 수 있습니다. 그러나 참고 없이는 포인터를 쿼리의 대상 변수로 사용할 수 없습니다. 자동 할당. 참조PostgreSQL : 문서 : 9.3 : 설명 자 스포츠 토토 베트맨 사용자동 할당에 대한 자세한 내용을 확인하세요.
EXEC 롤 토토 시작 선언 섹션;
int *intp;
char **charp;
EXEC 롤 토토 END 선언 섹션;이 섹션에는 비 스칼라 및 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;
구조가 다음에서 사용되지만가져오기명령, 다음의 속성 이름선택절이 하나씩 지정됩니다. 이것은 a를 사용하여 향상됨*모든 것을 요구하다 복합 유형 값의 속성입니다.
...
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[]. 하지만 그렇게 하면 해당 분야에 쉽게 접근할 수 없습니다. 호스트 프로그램의 값입니다.
새로운 사용자 정의 기본 유형은 ECPG에서 직접 지원되지 않습니다. 외부 문자열 표현과 호스트 변수를 사용할 수 있습니다. 유형문자[]또는VARCHAR[], 이 솔루션은 실제로 적절하며 다양한 유형에 충분합니다.
다음은 데이터 유형을 사용하는 예입니다.복잡한다음 예에서섹션 35.11. 외부 문자열 표현
그 유형은(%f,%f), 정의됨
함수에서복합체_인()그리고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, 작동해요 에서"표시 없음"모드. 지표가 없는 경우 모드에서 표시기 변수가 지정되지 않은 경우 널값은 문자열 유형에 대해 (입력 및 출력 시) 비어 있는 것으로 신호됨 문자열 및 정수 유형의 경우 유형에 대해 가능한 가장 낮은 값 (예를 들어,INT_MINforint).
| 이전 | 배트맨 토토 : 문서 : 9.3 : 배트맨 토토 9.3.25 문서화 | 다음 |
| 롤 토토 명령 실행 중 | 젠 토토 : 문서 : 9.3 : ECPG- C에 포함 된 SQL | 동적 롤 토토 |