이 문서는 지원되지 않는 버전의 Postgre롤 토토을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다Postgre롤 토토 : 문서 : 17 : 34.4. 호스트 사설 토토 사용버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

33.4. 호스트 롤 토토 사용

inPostgre범퍼카 토토 : 문서 : 9.3 : 실행 실행당신은 당신이 어떻게 보았는지 보았습니다 임베디드 롤 토토 프로그램에서 롤 토토 문을 실행할 수 있습니다. 일부 그 진술은 고정 값 만 사용했으며 방법을 제공하지 않았습니다. 사용자가 제공 한 값을 명령문에 삽입하거나 프로그램이 있습니다. 쿼리에 의해 반환 된 값을 처리하십시오. 그런 종류의 진술 실제 응용 프로그램에는 실제로 유용하지 않습니다. 이 섹션에서 설명합니다 C 프로그램과 라는 간단한 메커니즘을 사용한 임베디드 롤 토토 문호스트 롤 토토. 임베디드 롤 토토 프로그램에서 우리는 롤 토토 문을 고려하십시오게스트C 프로그램 코드에서호스트 언어. 따라서 C 프로그램의 롤 토토를라고합니다.호스트 롤 토토.

Postgre롤 토토 백엔드 사이의 값을 교환하는 또 다른 방법 ECPG 응용 프로그램은에 설명 된 롤 토토 디스크립터의 사용입니다.PostgreSQL : 문서 : 9.3 : 설명 자 스포츠 토토 베트맨 사용.

33.4.1. 개요

C 프로그램과 롤 토토 문 사이의 데이터 전달은 다음과 같습니다. 임베디드 롤 토토에서 특히 간단합니다. 프로그램을 갖는 대신 데이터를 다양한 설명에 붙여 넣으십시오 가치를 올바르게 인용하는 것과 같은 합병증은 간단히 C 변수의 이름을 롤 토토 문에 작성하여 접두사에 작성하십시오. 콜론. 예를 들어:

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

이 진술은 이름이 지정된 두 개의 c 롤 토토를 나타냅니다v1andv2a 당신이 한 종류의 데이터 또는 다른 데이터를 사용하도록 제한됩니다.

롤 토토 문에 C 변수를 삽입하는이 스타일 롤 토토 문에서 값 표현식이 예상되는 곳.

33.4.2. 섹션 선언

예를 들어 프로그램에서 데이터를 데이터베이스로 전달하려면 쿼리의 매개 변수 또는 데이터베이스의 데이터를 다시 전달합니다. 프로그램,이 데이터를 포함하려는 C 변수 특별히 표시된 섹션으로 선언해야하므로 내장 롤 토토 Preprocessor가 그들을 알고 있습니다.

이 섹션은 다음과 같이 시작합니다.

Exec 롤 토토 시작 선언 섹션;

:로 끝납니다.

exec 롤 토토 종료 선언 섹션;

해당 라인 사이에는 일반 C 변수가 있어야합니다 다음과 같은 선언

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

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

Exec 롤 토토 int i = 4;

당신은 당신만큼 프로그램에 많은 선언 섹션을 가질 수 있습니다. 좋다.

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

구조 또는 조합의 정의도 나열되어야합니다. 내부선언섹션. 그렇지 않으면 사전 처리기는 이러한 유형을 알지 못하므로 이러한 유형을 처리 할 수 ​​없습니다. 정의.

33.4.3. 쿼리 결과 검색

이제 프로그램에서 생성 된 데이터를 전달할 수 있어야합니다. 롤 토토 명령으로. 그러나 a의 결과를 어떻게 검색합니까? 질문? 이를 위해 내장 된 롤 토토은 특수 변형을 제공합니다 일반적인 명령selectFetch. 이 명령에는 특별한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조항은 결국 나타납니다 정상적인 조항.

33.4.4. 유형 매핑

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네이티브가 아닌 경우

33.4.4.1. 캐릭터 문자열 처리

롤 토토 문자열 데이터 유형을 처리하려면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호스트 롤 토토는 다른 롤 토토 유형의 값을 보유 할 수 있습니다. 문자열 형태로 저장됩니다.

33.4.4.2. 특수 데이터 액세스 유형

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

다음 하위 섹션에서는 이러한 특수 데이터 유형을 설명합니다. 을 위한 PGTYPES 라이브러리 기능에 대한 자세한 내용은 참조섹션 33.6.

33.4.4.2.1. 타임 스탬프, 날짜

다음은 처리 패턴입니다타임 스탬프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.

33.4.4.2.2. 간격

간격유형도 있습니다 와 비슷합니다타임 스탬프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;

33.4.4.2.3. 숫자, 소수점

숫자​​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;

33.4.4.3. 호스트 롤 토토 비 프리즘 유형

호스트 롤 토토로서 배열, typedefs, structs, 그리고 포인터.

33.4.4.3.1. 배열

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

33.4.4.3.2. 구조

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

다음 예제는 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;

33.4.4.3.3. typedefs

사용typedef새로운 매핑 키워드 이미 기존 유형의 유형.

exec 롤 토토 시작 선언 섹션;
    typedef char mychartype [40];
    typedef long serial_t;
EXEC 롤 토토 종료 선언 섹션;

사용할 수 있습니다.

exec 롤 토토 type serial_t는 길다;

이 선언은 선언의 일부일 필요는 없습니다. 부분.

33.4.4.3.4. 포인터

가장 일반적인 유형으로 포인터를 선언 할 수 있습니다. 그러나 참고 포인터를 쿼리의 대상 변수로 사용할 수 없다는 자동 할당. 보다PostgreSQL : 문서 : 9.3 : 설명 자 스포츠 토토 베트맨 사용자동 할당에 대한 자세한 내용은

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

33.4.5. 비발적 롤 토토 처리 데이터 유형

이 섹션에는 Nonscalar를 처리하는 방법에 대한 정보가 포함되어 있습니다. ECPG 애플리케이션에서 사용자 정의 롤 토토 레벨 데이터 유형. 주목하십시오 이것은 호스트 롤 토토의 처리와는 다릅니다. 이전 섹션에 설명 된 비 프리즘 유형.

33.4.5.1. 배열

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

33.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명령을 하나로 수집 할 수 있습니다 구조. 호스트 롤 토토에 대한 자세한 내용은 구조 양식, 참조섹션 33.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 []. 그러나 그렇게하면 호스트 프로그램의 가치.

33.4.5.3. 사용자 정의 기본 유형

새로운 사용자 정의 기본 유형은 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)';에 삽입

33.4.6. 표시기

위의 예제는 널 값을 처리하지 않습니다. 사실, 검색 예제는 널 값을 가져 오면 오류가 발생합니다. 데이터베이스에서. 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).