34.4. 호스트 롤 토토 사용#

inPostgre스포츠 토토 베트맨 : 문서 : 17 : 34.3. 실행 스포츠 토토 베트맨 명령임베디드 롤 토토 프로그램에서 롤 토토 문을 실행하는 방법을 보았습니다. 이러한 진술 중 일부는 고정 값 만 사용했으며 사용자가 제공 한 값을 명령문에 삽입하거나 프로그램이 쿼리에서 반환 한 값을 처리하도록하는 방법을 제공하지 않았습니다. 이러한 종류의 진술은 실제 응용 프로그램에서 실제로 유용하지 않습니다. 이 섹션은 C 프로그램과 내장 된 롤 토토 문들 사이에 데이터를 전달할 수있는 방법을 자세히 설명합니다.호스트 롤 토토. 임베디드 롤 토토 프로그램에서는 롤 토토 문을 고려합니다.손님C 프로그램 코드에서호스트 언어. 따라서 C 프로그램의 롤 토토를라고합니다.호스트 롤 토토.

Postgre롤 토토 백엔드와 ECPG 응용 프로그램 간의 값을 교환하는 또 다른 방법은에 설명 된 롤 토토 디스크립터 사용입니다.Postgre롤 토토 : 문서 : 17 : 34.7. 설명자 와이즈 토토 사용.

34.4.1. 개요#

C 프로그램과 롤 토토 문의 데이터 전달은 내장 된 롤 토토에서 특히 간단합니다. 프로그램이 데이터를 문장에 붙여 넣는 대신 값을 올바르게 인용하는 것과 같은 다양한 합병증을 수반하는 대신 C 변수의 이름을 콜론에 의해 접두사에 작성한 롤 토토 문에 간단히 쓸 수 있습니다. 예를 들어:

Exec 롤 토토 insert instable 값 (: v1, 'foo', : ​​v2);

이 진술은 이름라는 두 개의 c 롤 토토를 나타냅니다.v1andv2그리고 정기적 인 롤 토토 문자열 리터럴을 사용하여 한 종류의 데이터 또는 다른 데이터를 사용하도록 제한되지 않음을 설명합니다.

롤 토토 문에 C 변수를 삽입하는이 스타일은 롤 토토 문에서 값 표현식이 예상되는 곳 어디에서나 작동합니다.

34.4.2. 섹션 선언#

예를 들어 쿼리의 매개 변수와 같은 프로그램에서 데이터를 데이터베이스로 전달하거나 데이터베이스에서 데이터를 프로그램으로 다시 전달하려면이 데이터를 포함하려는 C 변수는 특별히 표시된 섹션에서 선언해야하므로 임베드 된 롤 토토 Preprocessor는 그들에 대한 정보를 제공합니다..

이 섹션은 :부터 시작합니다.

Exec 롤 토토 시작 선언 섹션;

:로 끝납니다.

Exec 롤 토토 End Declare 섹션;

해당 라인 사이에 :과 같은 일반 C 롤 토토 선언이 있어야합니다.

int x = 4;
Char Foo [16], Bar [16];

보시다시피, 초기 값을 롤 토토에 선택적으로 할당 할 수 있습니다. 롤 토토의 범위는 프로그램 내에서 선언 섹션의 위치에 따라 결정됩니다. 또한 다음 구문으로 롤 토토를 선언 할 수 있으며, 이는 선언 섹션을 암시 적으로 생성합니다.

Exec 롤 토토 int i = 4;

원하는만큼 프로그램에 많은 선언 섹션을 가질 수 있습니다.

선언은 또한 일반 C 변수로 출력 파일에 반향되므로 다시 선언 할 필요가 없습니다. 롤 토토 명령에 사용되지 않는 변수는이 특수 섹션 밖에서 정상적으로 선언 될 수 있습니다.

구조 또는 조합의 정의는 a 내부에 나열되어 있어야합니다.선언섹션. 그렇지 않으면 사전 처리기는 정의를 모르기 때문에 이러한 유형을 처리 할 수 ​​없습니다.

34.4.3. 쿼리 결과 검색#

이제 프로그램에서 생성 된 데이터를 롤 토토 명령으로 전달할 수 있어야합니다. 그러나 쿼리 결과를 어떻게 검색합니까? 이를 위해 임베디드 롤 토토은 일반적인 명령의 특수 변형을 제공합니다selectandfetch. 이 명령에는 특별한into검색된 값이 저장 될 호스트 롤 토토를 지정하는 조항.select단일 행만 반환하는 쿼리에 사용됩니다.Fetch커서를 사용하여 여러 행을 반환하는 쿼리에 사용됩니다.

여기 예입니다.

/*
 *이 테이블을 가정하십시오.
 * 테이블 생성 테스트 1 (a int, b varchar (50));
 */

Exec 롤 토토 시작 선언 섹션;
int v1;
바르 르 차 V2;
Exec 롤 토토 END DELLARE SECTION;

 ...

exec 롤 토토 a, b에 : v1, : v2 test;

theinSELECT 목록과 사이에 조항이 나타납니다.From절. 선택 목록의 요소 수와 다음 목록in(대상 목록이라고도 함)는 동일해야합니다.

다음은 명령을 사용하는 예입니다Fetch:

Exec 롤 토토 시작 선언 섹션;
int v1;
바르 르 차 V2;
Exec 롤 토토 END DELLARE SECTION;

 ...

Exec 롤 토토 선택 A, B Test에서 FOO Cursor를 선언합니다.

 ...

하다

    ...
    exec sql 다음은 foo에서 v1, : v2;
    ...
 하는 동안 (...);

여기into조항은 모든 정상적인 조항 후에 나타납니다.

34.4.4. 유형 매핑#

ECPG 애플리케이션이 Postgre롤 토토 서버와 C 응용 프로그램 간의 값을 교환 할 때, 예를 들어 서버에서 쿼리 결과를 검색하거나 입력 매개 변수로 롤 토토 문을 실행할 때와 같은 값은 Postgre롤 토토 데이터 유형과 호스트 언어 유형간에 변환해야합니다 (C 언어 데이터 유형, 구체적). ECPG의 주요 요점 중 하나는 대부분의 경우이를 자동으로 처리한다는 것입니다.

이와 관련하여 두 가지 종류의 데이터 유형이 있습니다.정수텍스트, 응용 프로그램에서 직접 읽고 쓸 수 있습니다. 와 같은 기타 Postgre롤 토토 데이터 유형타임 스탬프and숫자특수 라이브러리 기능을 통해서만 액세스 할 수 있습니다. 보다섹션 34.4.4.2.

표 34.1어떤 Postgre롤 토토 데이터 유형이 C 데이터 유형에 해당하는지 보여줍니다. 주어진 Postgre롤 토토 데이터 유형의 값을 보내거나 받으려면 선언 섹션에서 해당 C 데이터 유형의 C 변수를 선언해야합니다..

표 34.1. Postgre롤 토토 데이터 유형과 C 변수 유형 간의 매핑

Postgre롤 토토 데이터 유형 호스트 롤 토토 유형
smallint 짧은
Integer int
bigint 긴 긴 int
10 진수 Decimal[a]
숫자 숫자[a]
Real float
이중 정밀 더블
SmallSerial 짧은
Serial int
bigserial 긴 긴 int
OID 서명되지 않은 int
문자 (n), varchar (n), 텍스트 char [n+1], varchar [n+1]
이름 char [namedatalen]
타임 스탬프 타임 스탬프[A]
간격 간격[A]
날짜 날짜[a]
부울 bool[B]
BYTEA char *, Bytea [n]

[A]이 유형은 특수 라이브러리 기능을 통해서만 액세스 할 수 있습니다. 보다섹션 34.4.4.2.

[B]선언ecpglib.h네이티브가 아닌 경우


34.4.4.1. 캐릭터 문자열 처리#

롤 토토 문자열 데이터 유형을 처리하려면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상류 또는 소문자로 작성할 수는 있지만 혼합 된 경우에는 없습니다.

charandVarchar호스트 롤 토토는 다른 롤 토토 유형의 값을 보유 할 수 있으며,이 유형은 문자열 양식에 저장됩니다.

34.4.4.2. 특수 데이터 유형 액세스#

ECPG에는 Postgre롤 토토 서버의 일부 특수 데이터 유형과 쉽게 상호 작용하는 데 도움이되는 몇 가지 특수 유형이 포함되어 있습니다. 특히에 대한 지원을 구현했습니다.숫자, Decimal, 날짜, 타임 스탬프간격유형. 이러한 데이터 유형은 원시적 호스트 롤 토토 유형에 유용하게 매핑 될 수 없습니다 (예 :int, 긴 긴 int또는char [])는 복잡한 내부 구조를 가지고 있기 때문입니다. 응용 프로그램은 특수 유형의 호스트 롤 토토를 선언하고 PGTypes 라이브러리에서 기능을 사용하여 액세스하여 이러한 유형을 처리합니다. pgtypes 라이브러리,에 자세히 설명 된젠 토토 Postgre롤 토토 : 문서 : 17 : 34.6. PGTYPES 라이브러리예를 들어 타임 스탬프에 간격을 추가하기 위해 롤 토토 Server에 쿼리를 보낼 필요가 없도록 이러한 유형을 처리하는 기본 기능이 포함되어 있습니다.

다음 하위 섹션에서는 이러한 특수 데이터 유형을 설명합니다. PGTYPES 라이브러리 기능에 대한 자세한 내용은 참조하십시오.젠 토토 Postgre롤 토토 : 문서 : 17 : 34.6. PGTYPES 라이브러리.

34.4.4.2.1. 타임 스탬프, 날짜#

다음은 처리 패턴입니다타임 스탬프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 라이브러리 기능에 대한 자세한 내용은 참조하십시오.젠 토토 Postgre롤 토토 : 문서 : 17 : 34.6. PGTYPES 라이브러리.

34.4.4.2.2. 간격#

간격유형은 또한와 유사합니다.타임 스탬프and날짜유형. 그러나 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;
34.4.4.2.3. 숫자, 소수점#

숫자십진유형은와 유사합니다.간격유형 : 포인터를 정의하고, 힙에 일부 메모리 공간을 할당하고, pgtypes 라이브러리 기능을 사용하여 변수에 액세스해야합니다. PGTYPES 라이브러리 기능에 대한 자세한 내용은 참조하십시오.젠 토토 Postgre롤 토토 : 문서 : 17 : 34.6. PGTYPES 라이브러리.

|Decimal타입. 응용 프로그램은 a로 변환해야합니다.숫자추가 처리를 수행하기 위해 PGTYPES 라이브러리 기능을 사용하는 롤 토토.

여기 예제 프로그램 취급숫자and소수점롤 토토 유형.

#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;
34.4.4.2.4. 바이트#

BYTEA유형은와 유사합니다.Varchar. 유형 배열에 대한 정의BYTEA는 모든 변수에 대해 명명 된 구조로 변환됩니다. 다음과 같은 선언 :

Bytea var [180];

:로 변환됩니다.

Struct bytea_var int len; char arr [180];  var;

회원ARR이진 형식 데이터를 호스트합니다. 또한 처리 할 수 ​​있습니다'\ 0'데이터의 일부로Varchar. 데이터는/to hex 형식에서 변환되고 ecpglib에 의해 전송/수신됩니다.

Note

BYTEA롤 토토는 만 사용할 수 있습니다bytea_output로 설정되었습니다hex.

34.4.4.3. 비 프리즘 유형의 호스트 롤 토토#

호스트 롤 토토로서 배열, typedefs, structs 및 pointers를 사용할 수도 있습니다.

34.4.4.3.1. 배열#

호스트 롤 토토로 배열에 대한 두 가지 사용 사례가 있습니다. 첫 번째는 텍스트 문자열을 저장하는 방법입니다.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 =
34.4.4.3.2. 구조#

멤버 이름이 쿼리 결과의 열 이름과 일치하는 구조는 한 번에 여러 열을 검색하는 데 사용될 수 있습니다. 구조는 단일 호스트 롤 토토에서 여러 열 값을 처리 할 수 ​​있습니다.

다음 예제는 사용 가능한 데이터베이스의 OID, 이름 및 크기를 검색합니다.pg_database시스템 테이블 및 사용pg_database_size ()함수. 이 예에서는 구조 롤 토토dbinfo_tselect결과는 여러 호스트 롤 토토를 넣지 않고 하나의 결과 행을 검색하는 데 사용됩니다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;
34.4.4.3.3. typedefs#

사용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. 동적 토토 결과.)

Note

inPostgre롤 토토v16 이전에 릴리스, typedef 이름으로 롤 토토 키워드를 사용하면 이름을 롤 토토 키워드로 사용하기보다는 TypEdef 자체 사용과 관련된 구문 오류가 발생할 수 있습니다. 새로운 동작은 기존 ECPG 응용 프로그램이 새로운 상태에서 재 컴파일 될 때 문제를 일으킬 가능성이 적습니다Postgre롤 토토새 키워드로 릴리스.

34.4.4.3.4. 포인터#

가장 일반적인 유형으로 포인터를 선언 할 수 있습니다. 그러나 포인터를 자동 할당없이 쿼리의 대상 변수로 사용할 수는 없습니다. 보다Postgre롤 토토 : 문서 : 17 : 34.7. 설명자 와이즈 토토 사용자동 배치에 대한 자세한 내용은

exec 롤 토토 시작 선언 섹션;
    int *intp;
    char ** charp;
EXEC 롤 토토 종료 선언 섹션;

34.4.5. 비 프리밍 롤 토토 데이터 유형 처리#

이 섹션에는 ECPG 애플리케이션에서 Nonscalar 및 사용자 정의 롤 토토 레벨 데이터 유형을 처리하는 방법에 대한 정보가 포함되어 있습니다. 이는 이전 섹션에서 설명한 비 프라이드 유형의 호스트 롤 토토의 처리와는 다릅니다.

34.4.5.1. 배열#

다차원 롤 토토 레벨 어레이는 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. 이것은 배열이 호스트 프로그램의 배열로 자연스럽게 액세스 할 수 없음을 의미합니다 (텍스트 표현을 구문 분석하는 추가 처리없이).

34.4.5.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명령을 하나의 구조로 수집 할 수 있습니다. 구조 양식의 호스트 롤 토토에 대한 자세한 내용은 참조하십시오.섹션 34.4.4.3.2. 구조로 전환하려면 예를 다음과 같이 수정할 수 있습니다. 두 호스트 롤 토토intvalTextVal,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 []. 그러나 그렇게하면 호스트 프로그램에서 값의 필드에 액세스하는 것은 쉽지 않습니다.

34.4.5.3. 사용자 정의 기본 유형#

새로운 사용자 정의 기본 유형은 ECPG에서 직접 지원되지 않습니다. 유형의 외부 문자열 표현 및 호스트 롤 토토를 사용할 수 있습니다char []또는varchar [],이 솔루션은 실제로 많은 유형에 적합하고 충분합니다.

여기 데이터 유형을 사용하는 예입니다복잡한예제에서Postgre롤 토토 : 문서 : 17 : 36.13. 사용자 정의 토토 베이. 해당 유형의 외부 문자열 표현은입니다.(%f,%f), 함수에 정의되어 있습니다complex_in ()andcomplex_out ()함수Postgre롤 토토 : 문서 : 17 : 36.13. 사용자 정의 토토 베이. 다음 예제는 복잡한 유형 값을 삽입합니다(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가 처리 할 수있는 기본 유형을 변환하는 함수 또는 캐스트를 만듭니다. 그러나 이러한 유형의 캐스트, 특히 암시 적 캐스트는 유형 시스템에 매우 신중하게 도입되어야합니다.

예를 들어

CREATION 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)';에 삽입

34.4.6. 표시기#

위의 예제는 널 값을 처리하지 않습니다. 실제로 검색 예제는 데이터베이스에서 널 값을 가져 오면 오류가 발생합니다. NULL 값을 데이터베이스로 전달하거나 데이터베이스에서 NULL 값을 검색하려면 데이터가 포함 된 각 호스트 롤 토토에 대한 두 번째 호스트 롤 토토 사양을 추가해야합니다. 이 두 번째 호스트 롤 토토는라고합니다.표시기그리고 데이텀이 null인지 알려주는 플래그가 포함되어 있으며,이 경우 실제 호스트 롤 토토의 값은 무시됩니다. 다음은 널 값의 검색을 올바르게 처리하는 예입니다.

Exec 롤 토토 시작 선언 섹션;
varchar val;
int val_ind;
EXEC 롤 토토 종료 선언 섹션 :

 ...

exec 롤 토토 선택 B로 : val : val_ind from test1;

지표 롤 토토val_ind값이 null이 아닌 경우 0이되며 값이 무효화되면 음수가됩니다. (보다Postgre롤 토토 : 문서 : 17 : 34.16. Oracle 호환성 토토 베이Oracle-specific 행동을 활성화하려면)

표시기에는 또 다른 함수가 있습니다. 표시기 값이 양수 인 경우 값이 NULL이 아니지만 호스트 롤 토토에 저장 될 때 잘 렸습니다..

인수 인 경우-r no_indicator사전 처리기에게 전달ECPG에서 작동합니다no-Indicator모드. NO-Indicator 모드에서 표시기 변수가 지정되지 않으면 널 값이 비어있는 문자열로 문자열 유형에 대한 문자열 유형에 대한 신호 (입력 및 출력) 및 유형에 대한 최저 값 (예 :에 대한 정수 유형에 대한 신호를 나타냅니다.int_minforint).

정정 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면