Postgre롤 토토 9.3.25 문서 | ||||
---|---|---|---|---|
Postgre범퍼카 토토 : 문서 : 9.3 : 실행 실행 | 젠 토토 : 문서 : 9.3 : ECPG- C에 포함 된 SQL | 제 33 장ECPG- 임베디드롤 토토in c | 다음 |
inPostgre범퍼카 토토 : 문서 : 9.3 : 실행 실행당신은 당신이 어떻게 보았는지 보았습니다 임베디드 롤 토토 프로그램에서 롤 토토 문을 실행할 수 있습니다. 일부 그 진술은 고정 값 만 사용했으며 방법을 제공하지 않았습니다. 사용자가 제공 한 값을 명령문에 삽입하거나 프로그램이 있습니다. 쿼리에 의해 반환 된 값을 처리하십시오. 그런 종류의 진술 실제 응용 프로그램에는 실제로 유용하지 않습니다. 이 섹션에서 설명합니다 C 프로그램과 라는 간단한 메커니즘을 사용한 임베디드 롤 토토 문호스트 롤 토토. 임베디드 롤 토토 프로그램에서 우리는 롤 토토 문을 고려하십시오게스트C 프로그램 코드에서호스트 언어. 따라서 C 프로그램의 롤 토토를라고합니다.호스트 롤 토토.
Postgre롤 토토 백엔드 사이의 값을 교환하는 또 다른 방법 ECPG 응용 프로그램은에 설명 된 롤 토토 디스크립터의 사용입니다.PostgreSQL : 문서 : 9.3 : 설명 자 스포츠 토토 베트맨 사용.
C 프로그램과 롤 토토 문 사이의 데이터 전달은 다음과 같습니다. 임베디드 롤 토토에서 특히 간단합니다. 프로그램을 갖는 대신 데이터를 다양한 설명에 붙여 넣으십시오 가치를 올바르게 인용하는 것과 같은 합병증은 간단히 C 변수의 이름을 롤 토토 문에 작성하여 접두사에 작성하십시오. 콜론. 예를 들어:
Exec 롤 토토 insert initeable 값 (: v1, 'foo', : v2);
이 진술은 이름이 지정된 두 개의 c 롤 토토를 나타냅니다v1andv2a 당신이 한 종류의 데이터 또는 다른 데이터를 사용하도록 제한됩니다.
롤 토토 문에 C 변수를 삽입하는이 스타일 롤 토토 문에서 값 표현식이 예상되는 곳.
예를 들어 프로그램에서 데이터를 데이터베이스로 전달하려면 쿼리의 매개 변수 또는 데이터베이스의 데이터를 다시 전달합니다. 프로그램,이 데이터를 포함하려는 C 변수 특별히 표시된 섹션으로 선언해야하므로 내장 롤 토토 Preprocessor가 그들을 알고 있습니다.
이 섹션은 다음과 같이 시작합니다.
Exec 롤 토토 시작 선언 섹션;
:로 끝납니다.
exec 롤 토토 종료 선언 섹션;
해당 라인 사이에는 일반 C 변수가 있어야합니다 다음과 같은 선언
int x = 4; Char Foo [16], Bar [16];
보시다시피, 초기 값을 선택적으로 할당 할 수 있습니다. 변수. 변수의 범위는 위치에 따라 결정됩니다 프로그램 내에서 선언하는 섹션. 당신은 또한 선언 할 수 있습니다 암시 적으로 생성하는 다음 구문이있는 변수 a 섹션 선언 :
Exec 롤 토토 int i = 4;
당신은 당신만큼 프로그램에 많은 선언 섹션을 가질 수 있습니다. 좋다.
선언은 또한 출력 파일에 정상 C로 반향됩니다. 변수이므로 다시 선언 할 필요가 없습니다. 변수 롤 토토 명령에 사용되도록 의도되지 않습니다. 일반적 으로이 특별 섹션 밖에서.
구조 또는 조합의 정의도 나열되어야합니다. 내부선언섹션. 그렇지 않으면 사전 처리기는 이러한 유형을 알지 못하므로 이러한 유형을 처리 할 수 없습니다. 정의.
이제 프로그램에서 생성 된 데이터를 전달할 수 있어야합니다. 롤 토토 명령으로. 그러나 a의 결과를 어떻게 검색합니까? 질문? 이를 위해 내장 된 롤 토토은 특수 변형을 제공합니다 일반적인 명령select및Fetch. 이 명령에는 특별한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절. 그만큼 선택 목록의 요소 수와 다음 목록into(대상 목록이라고도 함) 동일한.
다음은 명령을 사용하는 예입니다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의 주요 요점 중 하나는 이것을 처리한다는 것입니다. 대부분의 경우 자동으로.
이와 관련하여 두 가지 종류의 데이터 유형이 있습니다. 와 같은 Postgre롤 토토 데이터 유형정수and텍스트는 읽고 쓸 수 있습니다 직접 응용 프로그램. 와 같은 기타 Postgre롤 토토 데이터 유형타임 스탬프and숫자특수 라이브러리 기능을 통해서만 액세스 할 수 있습니다. 보다섹션 33.4.4.2.
테이블 33-1어떤 Postgre롤 토토 데이터 유형이 C에 해당하는지 보여줍니다 데이터 유형. 주어진 값을 보내거나 받고 싶을 때 Postgre롤 토토 데이터 유형, C 변수를 선언해야합니다. 선언 섹션의 해당 C 데이터 유형.
표 33-1. Postgre롤 토토 데이터 유형과 c. 사이의 매핑 c 가변 유형
Postgre롤 토토 데이터 유형 | 호스트 롤 토토 유형 |
---|---|
smallint | 짧은 |
Integer | int |
bigint | 긴 긴 int |
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네이티브가 아닌 경우 |
롤 토토 문자열 데이터 유형을 처리하려면varcharand텍스트두 개가 있습니다 호스트 롤 토토를 선언하는 가능한 방법.
한 가지 방법은 사용 중char [], 배열char, 가장 일반적인 처리 방법입니다 C의 문자 데이터
exec 롤 토토 시작 선언 섹션; char str [50]; EXEC 롤 토토 종료 선언 섹션;
길이를 직접 돌봐야합니다. 당신이 이 호스트 롤 토토를 쿼리의 대상 변수로 사용하십시오. 49 자 이상의 문자열을 반환, 버퍼 오버플로 발생합니다.
다른 방법은 사용 중입니다.varchar타입, ECPG가 제공하는 특수 유형입니다. an에 대한 정의 유형 배열Varchara로 변환됩니다 이름struct모든 변수에 대해. 에이 선언 :
Varchar var [180];
Struct varchar_var int len; char arr [180]; var;
회원ARR문자열을 호스팅합니다 종단 제로 바이트를 포함합니다. 따라서 문자열을 a 저장하려면Varchar호스트 롤 토토는 호스트 롤 토토가 있습니다 제로 바이트 터미네이터를 포함한 길이로 선언됩니다. 회원Len에 저장된 문자열ARR없이 제로 바이트 종단. 호스트 롤 토토가 쿼리, ifStrlen (ARR)andLen다르고 짧은 것이 사용됩니다.
Varchar상단 또는 하단으로 작성할 수 있습니다 사례, 그러나 혼합 된 경우는 아닙니다.
charandVarchar호스트 롤 토토는 다른 롤 토토 유형의 값을 보유 할 수 있습니다. 문자열 형태로 저장됩니다.
ECPG는 상호 작용하는 데 도움이되는 특수 유형이 포함되어 있습니다. Postgre롤 토토 서버의 일부 특수 데이터 유형으로 쉽게 쉽게. ~ 안에 특히, 그것은에 대한 지원을 구현했습니다.숫자, Decimal, 날짜, 타임 스탬프및간격유형. 이러한 데이터 유형은 유용하지 않습니다 원시 호스트 롤 토토 유형에 매핑 (int, 긴 긴 int또는char [])는 복잡한 내부가 있기 때문입니다 구조. 응용 프로그램은 호스트를 선언하여 이러한 유형을 처리합니다 특수 유형의 변수 및 함수를 사용하여 액세스하는 변수 PGTYPES 라이브러리. pgtypes 라이브러리,에 자세히 설명 된와이즈 토토 PostgreSQL : 문서 : 9.3 : PGTYPES 라이브러리기본을 포함합니다 이러한 유형을 다루는 기능, 필요하지 않도록 간격을 추가하기 위해 롤 토토 Server에 쿼리를 보내십시오. 예를 들어 타임 스탬프.
다음 하위 섹션에서는 이러한 특수 데이터 유형을 설명합니다. 을 위한 PGTYPES 라이브러리 기능에 대한 자세한 내용은 참조섹션 33.6.
다음은 처리 패턴입니다타임 스탬프ECPG 호스트 응용 프로그램의 변수.
먼저, 프로그램에는에 대한 헤더 파일을 포함해야합니다.타임 스탬프유형 :
#include <pgtypes_timestamp.h
다음, 호스트 롤 토토를 유형으로 선언타임 스탬프선언 섹션 :
Exec 롤 토토 시작 선언 섹션; 타임 스탬프 TS; EXEC 롤 토토 종료 선언 섹션;
그리고 호스트 롤 토토에 값을 읽은 후 처리하십시오.
PGTYPES 라이브러리 기능 사용. 다음 예에서타임 스탬프값은 텍스트로 변환됩니다
(ASCII)와 형태pgtypestimestamp_to_asc ()
기능 :
exec sql 선택 () :: 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 라이브러리 기능에 대해 참조섹션 33.6.
간격유형도 있습니다 와 비슷합니다타임 스탬프and날짜유형. 그러나 메모리를 할당해야합니다 for간격명시 적으로 값을 입력하십시오. ~ 안에 즉, 롤 토토의 메모리 공간을 할당해야합니다. 스택 메모리가 아닌 힙 메모리에서.
여기 예제 프로그램이 있습니다 :
#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;
숫자and10 진수유형은와 유사합니다.간격타입 : 포인터 정의, 힙에 일부 메모리 공간을 할당하고 액세스 PGTYPES 라이브러리 기능을 사용하는 롤 토토. 자세한 내용은 PGTYPES 라이브러리 기능에 대해 참조섹션 33.6.
기능이 특별히 제공되지 않습니다.Decimal타입. 응용 프로그램은 a로 변환해야합니다.숫자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에 연결; 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;
호스트 롤 토토로서 배열, typedefs, structs, 그리고 포인터.
호스트 롤 토토로 배열에 대한 두 가지 사용 사례가 있습니다. 첫 번째 텍스트 문자열을 저장하는 방법입니다.char []또는varchar [],섹션 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 롤 토토 선택 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 ()
함수. 이 예에서 a
구조 롤 토토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 = 템플릿 1, size = 4324580 OID = 11510, datname = template0, size = 4243460 OID = 11511, datname = postgres, size = 4324580 OID = 313780, datname = testdb, size = 8183012
구조 호스트 롤 토토"흡수"AS 많은 열이 필드로 구조로. 추가 열이 될 수 있습니다 다른 호스트 롤 토토에 할당됩니다. 예를 들어 위의 프로그램입니다 와 같이 이와 같이 재구성 될 수 있습니다.크기구조 외부의 롤 토토 :
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는 길다;
이 선언은 선언의 일부일 필요는 없습니다. 부분.
가장 일반적인 유형으로 포인터를 선언 할 수 있습니다. 그러나 참고 포인터를 쿼리의 대상 변수로 사용할 수 없다는 자동 할당. 보다PostgreSQL : 문서 : 9.3 : 설명 자 스포츠 토토 베트맨 사용자동 할당에 대한 자세한 내용은
exec 롤 토토 시작 선언 섹션; int *intp; char ** charp; EXEC 롤 토토 종료 선언 섹션;
이 섹션에는 Nonscalar를 처리하는 방법에 대한 정보가 포함되어 있습니다. ECPG 애플리케이션에서 사용자 정의 롤 토토 레벨 데이터 유형. 주목하십시오 이것은 호스트 롤 토토의 처리와는 다릅니다. 이전 섹션에 설명 된 비 프리즘 유형.
다차원 롤 토토 레벨 어레이는 직접 지원되지 않습니다 ECPG. 1 차원 롤 토토 레벨 어레이는 C 어레이에 매핑 될 수 있습니다 호스트 롤 토토 및 그 반대. 그러나 진술을 만들 때 ECPG는 열의 유형을 알지 못하므로 C 배열이 해당 롤 토토 레벨 어레이에 입력되어 있는지 확인하십시오. 롤 토토 문의 출력을 처리 할 때 ECPG는 다음과 같습니다. 필요한 정보와 두 배열인지 확인합니다.
쿼리에 액세스하는 경우요소배열의 별도 이것은 ECPG에서 어레이를 사용하지 않습니다. 그런 다음 a 요소 유형에 매핑 할 수있는 유형을 사용해야합니다. 을 위한 예, 열 유형이 배열 인 경우정수, 유형의 호스트 롤 토토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. 구조로 전환하려면 예를 다음과 같이 수정할 수 있습니다. 두 호스트 롤 토토intval및TextVal,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. 외부 문자열 표현
그 유형의(%f,%f)기능에서complex_in ()
및complex_out ()
함수섹션 35.11. 다음 예제는
복잡한 유형 값(1,1)and(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에서 사용자 정의 유형과 대신 함수 또는 캐스트를 만듭니다. 사용자 정의 유형과 원시 유형을 변환합니다. 그 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 롤 토토 test_complex 값 ( '(1,2)', '(3,4)';에 삽입
위의 예제는 널 값을 처리하지 않습니다. 사실, 검색 예제는 널 값을 가져 오면 오류가 발생합니다. 데이터베이스에서. NULL 값을 데이터베이스에 전달할 수 있으려면 또는 데이터베이스에서 NULL 값을 검색하면 A를 추가해야합니다. 각 호스트 롤 토토에 대한 두 번째 호스트 롤 토토 사양 데이터가 포함되어 있습니다. 이 두 번째 호스트 롤 토토는라고합니다.표시기데이텀은 NULL이며,이 경우 실제 호스트의 값 변수는 무시됩니다. 다음은 검색을 처리하는 예입니다 NULL 값의 올바르게 :
Exec 롤 토토 시작 선언 섹션; varchar val; int val_ind; EXEC 롤 토토 종료 선언 섹션 : ... exec 롤 토토 선택 B로 : val : val_ind from test1;
지표 롤 토토val_ind값이 무효가 아닌 경우 0, 가치는 널이었다.
표시기에는 또 다른 기능이 있습니다. 표시기 값이 긍정적, 그것은 값이 무효가 아니지만 잘라 냈다는 것을 의미합니다. 호스트 롤 토토에 저장된 경우
인수 인 경우-r no_indicatoris 전처리 자에게 전달ECPG, 작동합니다 안에"No-Indicator"모드. NO-Indicator에서 모드, 표시기 변수가 지정되지 않으면 NULL 값은 비어있는 문자열 유형의 신호 (입력 및 출력) 문자열 및 정수 유형의 경우 유형의 가장 낮은 값 (예를 들어,int_minforint).
이전 | 배트맨 롤 토토 : 문서 : 9.3 : 배트맨 토토 9.3.25 문서화 | 다음 |
롤 토토 명령 실행 | 젠 토토 : 문서 : 9.3 : ECPG- C에 포함 된 SQL | 동적 롤 토토 |