35.4. 호스트 배트맨 토토 사용

Postgre토토 커뮤니티 : 문서 : 13 : 35.3. 실행 토토 커뮤니티 명령당신은 Embedded SQL 프로그램에서 SQL문을 실행하는 방법을 보았습니다. 이러한 명령문 중 일부는 고정 값만 사용했으며 사용자 제공 값을 명령문에 삽입하거나 프로그램이 쿼리에서 반환된 값을 처리하도록 하는 방법을 제공하지 않았습니다. 이러한 종류의 설명은 실제 응용 프로그램에서는 실제로 유용하지 않습니다. 이 섹션에서는 다음과 같은 간단한 메커니즘을 사용하여 C 프로그램과 내장 SQL 문 간에 데이터를 전달하는 방법을 자세히 설명합니다.호스트 배트맨 토토. Embedded SQL 프로그램에서 우리는 SQL 문을 다음과 같이 간주합니다.손님C 프로그램 코드에서호스트 언어. 따라서 C 프로그램의 배트맨 토토가 호출됩니다.호스트 배트맨 토토.

PostgreSQL 백엔드와 ECPG 애플리케이션 간에 값을 교환하는 또 다른 방법은 SQL 설명자를 사용하는 것입니다.Postgre토토 꽁 머니 : 문서 : 13 : 35.7. 설명자 영역 사용.

35.4.1. 개요

C 프로그램과 SQL 문 사이에 데이터를 전달하는 것은 Embedded SQL에서 특히 간단합니다. 프로그램이 데이터를 명령문에 붙여넣도록 하는 대신(예: 값을 적절하게 인용하는 등 다양한 복잡함을 수반함) C 변수의 이름을 SQL 명령문에 앞에 콜론을 붙여 간단히 쓸 수 있습니다. 예를 들면:

EXEC SQL INSERT INTO sometable VALUES(:v1, 'foo', :v2);

이 명령문은 두 개의 C 배트맨 토토를 참조합니다.v1그리고v2또한 일반 SQL 문자열 리터럴을 사용하여 한 종류의 데이터 또는 다른 종류의 데이터를 사용하도록 제한되지 않음을 보여줍니다.

SQL 문에 C 변수를 삽입하는 이 스타일은 SQL 문에서 값 식이 예상되는 모든 곳에서 작동합니다.

35.4.2. 섹션 선언

예를 들어 쿼리의 매개변수로 프로그램에서 데이터베이스로 데이터를 전달하거나 데이터베이스에서 프로그램으로 데이터를 다시 전달하려면 이 데이터를 포함하도록 의도된 C 변수를 특별히 표시된 섹션에서 선언해야 하므로 Embedded SQL 전처리기가 이를 인식할 수 있습니다.

이 섹션은 다음으로 시작됩니다:

EXEC SQL 시작 선언 섹션;

그리고 다음으로 끝납니다:

EXEC SQL END DECLARE SECTION;

이 줄 사이에는 다음과 같은 일반 C 변수 선언이 있어야 합니다.

int x = 4;
char foo[16], bar[16];

보시다시피 선택적으로 변수에 초기값을 할당할 수 있습니다. 변수의 범위는 프로그램 내 선언 섹션의 위치에 따라 결정됩니다. 선언 섹션을 암시적으로 생성하는 다음 구문을 사용하여 변수를 선언할 수도 있습니다.

EXEC SQL int i = 4;

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

선언은 일반 C 변수로 출력 파일에 반영되므로 다시 선언할 필요가 없습니다. SQL 명령에 사용되지 않는 변수는 일반적으로 이러한 특수 섹션 외부에서 선언될 수 있습니다.

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

35.4.3. 쿼리 결과 검색

이제 프로그램에서 생성된 데이터를 SQL 명령으로 전달할 수 있습니다. 그러면 쿼리 결과를 어떻게 검색합니까? 이러한 목적을 위해 Embedded SQL은 일반적인 명령의 특별한 변형을 제공합니다.선택그리고가져오기. 이 명령에는 특별한INTO검색된 값이 저장될 호스트 배트맨 토토를 지정하는 절.선택은 단일 행만 반환하는 쿼리에 사용됩니다.가져오기커서를 사용하여 여러 행을 반환하는 쿼리에 사용됩니다.

다음은 예입니다:

/*
 * 다음 표를 가정합니다.
 * CREATE TABLE test1 (a int, b varchar(50));
 */

EXEC SQL 시작 선언 섹션;
int v1;
VARCHAR v2;
EXEC SQL END 선언 섹션;

 ...

EXEC SQL SELECT a, b INTO :v1, :v2 FROM 테스트;

그래서INTO선택 목록과 사이에 절이 나타납니다.발신절. 선택 목록과 그 이후 목록의 요소 수INTO(대상 목록이라고도 함)은 동일해야 합니다.

다음은 명령을 사용하는 예입니다.가져오기:

EXEC SQL 시작 선언 섹션;
int v1;
VARCHAR v2;
EXEC SQL END 선언 섹션;

 ...

EXEC SQL DECLARE foo CURSOR FOR SELECT a, b FROM test;

 ...

하다

    ...
    EXEC SQL FETCH NEXT FROM FROM INTO :v1, :v2;
    ...
 동안 (...);

여기INTO절은 모든 일반 절 뒤에 나타납니다.

35.4.4. 유형 매핑

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

이와 관련하여 데이터 유형에는 두 가지 종류가 있습니다. 다음과 같은 간단한 PostgreSQL 데이터 유형정수그리고텍스트, 애플리케이션에서 직접 읽고 쓸 수 있습니다. 기타 PostgreSQL 데이터 유형(예:타임스탬프그리고숫자특수 라이브러리 기능을 통해서만 접근할 수 있습니다. 참조섹션 35.4.4.2.

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

표 35.1. PostgreSQL 데이터 유형과 C 변수 유형 간의 매핑

PostgreSQL 데이터 유형 호스트 배트맨 토토 유형
smallint 짧은
정수 int
비긴트 긴 긴 정수
십진수 십진수[a]
숫자 숫자[a]
진짜 플로트
배정밀도 더블
smallserial 짧은
연재 int
큰 직렬 긴 긴 정수
oid 부호 없는 정수
문자(n), varchar(n), 텍스트 문자[n+1], VARCHAR[n+1]
이름 문자[NAMEDATALEN]
타임스탬프 타임스탬프[a]
간격 간격[a]
날짜 날짜[a]
부울 부울[b]
바이테아 문자 *, 바이테아[n]

[a]이 유형은 특수 라이브러리 기능을 통해서만 접근할 수 있습니다. 참조섹션 35.4.4.2.

[b]다음에 선언됨ecpglib.h원주민이 아닌 경우


35.4.4.1. 문자열 처리

다음과 같은 SQL 문자열 데이터 유형을 처리하려면varchar그리고텍스트, 호스트 배트맨 토토를 선언하는 방법에는 두 가지가 있습니다.

편도는 다음을 사용하고 있습니다.문자[], 배열문자, 이는 C에서 문자 데이터를 처리하는 가장 일반적인 방법입니다.

EXEC SQL 시작 선언 섹션;
    문자 문자열[50];
EXEC SQL END 선언 섹션;

길이는 스스로 관리해야 한다는 점에 유의하세요. 이 호스트 배트맨 토토를 49자 이상의 문자열을 반환하는 쿼리의 대상 변수로 사용하면 버퍼 오버플로가 발생합니다.

다른 방법은 다음을 사용하는 것입니다.VARCHARtype은 ECPG에서 제공하는 특수 유형입니다. 유형의 배열에 대한 정의VARCHAR이름이 지정된 것으로 변환됩니다구조체모든 변수에 대해. 다음과 같은 선언:

VARCHAR var[180];

다음으로 변환됩니다:

struct varchar_var  int len; 문자 arr[180];  변수;

회원arr종료 0바이트를 포함하는 문자열을 호스팅합니다. 따라서 a에 문자열을 저장하려면VARCHAR호스트 배트맨 토토, 호스트 배트맨 토토는 0바이트 종결자를 포함한 길이로 선언되어야 합니다. 회원len에 저장된 문자열의 길이를 보유합니다.arr종료 0바이트 없이. 호스트 배트맨 토토가 쿼리의 입력으로 사용되는 경우, ifstrlen(arr)그리고len다르며 짧은 것이 사용됩니다.

VARCHAR대문자나 소문자로 쓸 수 있지만 대소문자를 혼합하여 쓸 수는 없습니다.

문자그리고VARCHAR호스트 배트맨 토토는 문자열 형식으로 저장될 다른 SQL 유형의 값도 보유할 수 있습니다.

35.4.4.2. 특수 데이터 유형에 액세스

ECPG에는 PostgreSQL 서버의 일부 특수 데이터 유형과 쉽게 상호 작용하는 데 도움이 되는 일부 특수 유형이 포함되어 있습니다. 특히, 다음과 같은 지원을 구현했습니다.숫자, 십진수, 날짜, 타임스탬프간격유형. 이러한 데이터 유형은 기본 호스트 배트맨 토토 유형(예:int, 긴 긴 정수또는문자[]), 내부 구조가 복잡하기 때문입니다. 애플리케이션은 특수 유형의 호스트 배트맨 토토를 선언하고 pgtypes 라이브러리의 함수를 사용하여 액세스하여 이러한 유형을 처리합니다. pgtypes 라이브러리에 대한 자세한 내용은메이저 토토 사이트 PostgreSQL : 문서 : 13 : 35.6. PGTYPES 라이브러리예를 들어 타임스탬프에 간격을 추가하기 위해 SQL 서버에 쿼리를 보낼 필요가 없도록 이러한 유형을 처리하는 기본 기능이 포함되어 있습니다.

다음 하위 섹션에서는 이러한 특수 데이터 유형을 설명합니다. pgtypes 라이브러리 함수에 대한 자세한 내용은 다음을 참조하세요.메이저 토토 사이트 PostgreSQL : 문서 : 13 : 35.6. PGTYPES 라이브러리.

35.4.4.2.1. 타임스탬프, 날짜

다음은 처리 패턴입니다타임스탬프ECPG 호스트 애플리케이션의 변수.

먼저, 프로그램은 다음에 대한 헤더 파일을 포함해야 합니다.타임스탬프유형:

#include <pgtypes_timestamp.h

다음으로 호스트 배트맨 토토를 유형으로 선언타임스탬프선언 섹션에서:

EXEC SQL 시작 선언 섹션;
타임스탬프 TS;
EXEC SQL END 선언 섹션;

그리고 호스트 배트맨 토토로 값을 읽은 후 pgtypes 라이브러리 함수를 사용하여 처리합니다. 다음 예에서는타임스탬프값은 다음을 사용하여 텍스트(ASCII) 형식으로 변환됩니다.PGTYPEStimestamp_to_asc()기능:

EXEC SQL 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 : 문서 : 13 : 35.6. PGTYPES 라이브러리.

35.4.4.2.2. 간격

다음의 처리간격유형도 다음과 유사합니다.타임스탬프그리고날짜유형. 그러나 메모리를 할당해야 합니다.간격값을 명시적으로 입력하세요. 즉, 배트맨 토토에 대한 메모리 공간은 스택 메모리가 아닌 힙 메모리에 할당되어야 합니다.

다음은 예제 프로그램입니다:

#include <stdio.h
#include <stdlib.h
#include <pgtypes_interval.h

정수
메인(공허)

EXEC SQL 시작 선언 섹션;
    간격 *in;
EXEC SQL END 선언 섹션;

    EXEC SQL CONNECT TO testdb;
    EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL 커밋;

    in = PGTYPESinterval_new();
    EXEC SQL SELECT '1분'::간격 INTO :in;
    printf("간격 = %s\n", PGTYPESinterval_to_asc(in));
    PGTYPESinterval_free(in);

    EXEC SQL 커밋;
    EXEC SQL 모두 연결 해제;
    0을 반환합니다.
35.4.4.2.3. 숫자, 십진수

다음의 처리숫자그리고십진수유형은 다음과 유사합니다.간격type: 포인터를 정의하고, 힙에 일부 메모리 공간을 할당하고, pgtypes 라이브러리 함수를 사용하여 변수에 액세스해야 합니다. pgtypes 라이브러리 함수에 대한 자세한 내용은 다음을 참조하세요.메이저 토토 사이트 PostgreSQL : 문서 : 13 : 35.6. PGTYPES 라이브러리.

특정 기능은 제공되지 않습니다.십진수유형. 애플리케이션은 이를 a로 변환해야 합니다.숫자추가 처리를 위해 pgtypes 라이브러리 함수를 사용하는 배트맨 토토.

다음은 프로그램 처리 예시입니다숫자그리고십진수배트맨 토토를 입력하세요.

#include <stdio.h
#include <stdlib.h
#include <pgtypes_numeric.h

SQLERROR가 중지될 때마다 EXEC SQL;

정수
메인(공허)

EXEC SQL 시작 선언 섹션;
    숫자 *번호;
    숫자 *num2;
    십진수 *dec;
EXEC SQL END 선언 섹션;

    EXEC SQL CONNECT TO testdb;
    EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL 커밋;

    num = PGTYPESnumeric_new();
    dec = PGTYPESdecimal_new();

    EXEC SQL 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 SQL 커밋;
    EXEC SQL 모두 연결 해제;
    0을 반환합니다.
35.4.4.2.4. 바이티

다음의 처리바이테아유형은 다음과 유사합니다.VARCHAR. 유형의 배열에 대한 정의바이테아은 모든 변수에 대해 명명된 구조체로 변환됩니다. 다음과 같은 선언:

bytea var[180];

다음으로 변환됩니다:

struct bytea_var  int len; 문자 arr[180];  변수;

회원arr바이너리 형식 데이터를 호스팅합니다. 처리할 수도 있습니다.'\0'데이터의 일부로, 달리VARCHAR. 데이터는 16진수 형식으로 변환되고 ecpglib에 의해 전송/수신됩니다.

참고

바이테아변수는 다음 경우에만 사용할 수 있습니다.bytea_output다음으로 설정됨16진수.

35.4.4.3. 기본이 아닌 유형의 호스트 배트맨 토토

호스트 배트맨 토토로서 배열, 형식 정의, 구조체 및 포인터를 사용할 수도 있습니다.

35.4.4.3.1. 배열

배열을 호스트 배트맨 토토로 사용하는 경우에는 두 가지가 있습니다. 첫 번째는 텍스트 문자열을 저장하는 방법입니다.문자[]또는VARCHAR[], 설명된 대로섹션 35.4.4.1. 두 번째 사용 사례는 커서를 사용하지 않고 쿼리 결과에서 여러 행을 검색하는 것입니다. 배열이 없을 때 여러 행으로 구성된 쿼리 결과를 처리하려면 커서와가져오기명령. 그러나 배열 호스트 배트맨 토토를 사용하면 여러 행을 한 번에 수신할 수 있습니다. 모든 행을 수용할 수 있도록 배열의 길이를 정의해야 합니다. 그렇지 않으면 버퍼 오버플로가 발생할 수 있습니다.

다음 예는 다음을 스캔합니다.pg_database시스템 테이블에 사용 가능한 데이터베이스의 모든 OID와 이름이 표시됩니다.

정수
메인(공허)

EXEC SQL 시작 선언 섹션;
    int dbid[8];
    char 데이터베이스 이름[8][16];
    나는 int;
EXEC SQL END 선언 섹션;

    memset(dbname, 0, sizeof(char)* 16 * 8);
    memset(dbid, 0, sizeof(int) * 8);

    EXEC SQL CONNECT TO testdb;
    EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL 커밋;

    /* 한 번에 여러 행을 배열로 검색합니다. */
    EXEC SQL 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 SQL 커밋;
    EXEC SQL 모두 연결 해제;
    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 이름=
35.4.4.3.2. 구조

구성원 이름이 쿼리 결과의 열 이름과 일치하는 구조를 사용하여 한 번에 여러 열을 검색할 수 있습니다. 이 구조를 사용하면 단일 호스트 배트맨 토토에서 여러 열 값을 처리할 수 있습니다.

다음 예는 다음에서 사용 가능한 데이터베이스의 OID, 이름 및 크기를 검색합니다.pg_database시스템 테이블 및 사용pg_database_size()함수. 이 예에서는 구조 배트맨 토토dbinfo_t이름이 다음의 각 열과 일치하는 구성원으로선택result는 여러 호스트 배트맨 토토를 넣지 않고 하나의 결과 행을 검색하는 데 사용됩니다.가져오기진술.

EXEC SQL 시작 선언 섹션;
    typedef 구조체

       int oid;
       char 데이터이름[65];
       긴 긴 정수 크기;
     dbinfo_t;

    dbinfo_t dbval;
EXEC SQL END 선언 섹션;

    memset(&dbval, 0, sizeof(dbinfo_t));

    EXEC SQL DECLARE cur1 CURSOR FOR SELECT oid, datname, pg_database_size(oid) AS size FROM pg_database;
    EXEC SQL OPEN cur1;

    /* 결과 집합의 끝에 도달하면 while 루프에서 빠져나옵니다 */
    EXEC SQL을 찾을 수 없을 때 중단하십시오.

    동안 (1)

        /* 여러 열을 하나의 구조로 가져옵니다. */
        cur1 INTO에서 EXEC SQL 가져오기 :dbval;

        /* 구조체의 멤버를 인쇄합니다. */
        printf("oid=%d, datname=%s, 크기=%lld\n", dbval.oid, dbval.datname, dbval.size);

    EXEC SQL CLOSE cur1;

이 예는 다음 결과를 보여줍니다. (정확한 값은 현지 상황에 따라 다릅니다.)

oid=1, datname=template1, 크기=4324580
oid=11510, datname=template0, 크기=4243460
oid=11511, datname=postgres, 크기=4324580
oid=313780, datname=testdb, 크기=8183012

구조 호스트 배트맨 토토흡수필드만큼 구조만큼 많은 열이 있습니다. 추가 열을 다른 호스트 배트맨 토토에 지정할 수 있습니다. 예를 들어, 위 프로그램은 다음과 같이 재구성될 수도 있습니다.크기구조 외부의 배트맨 토토:

EXEC SQL 시작 선언 섹션;
    typedef 구조체

       int oid;
       char 데이터이름[65];
     dbinfo_t;

    dbinfo_t dbval;
    긴 긴 정수 크기;
EXEC SQL END 선언 섹션;

    memset(&dbval, 0, sizeof(dbinfo_t));

    EXEC SQL DECLARE cur1 CURSOR FOR SELECT oid, datname, pg_database_size(oid) AS size FROM pg_database;
    EXEC SQL OPEN cur1;

    /* 결과 집합의 끝에 도달하면 while 루프에서 빠져나옵니다 */
    EXEC SQL을 찾을 수 없을 때 중단하십시오.

    동안 (1)

        /* 여러 열을 하나의 구조로 가져옵니다. */
        cur1 INTO에서 EXEC SQL 가져오기 :dbval, :size;

        /* 구조체의 멤버를 인쇄합니다. */
        printf("oid=%d, datname=%s, 크기=%lld\n", dbval.oid, dbval.datname, 크기);

    EXEC SQL CLOSE cur1;
35.4.4.3.3. 형식 정의

사용형정의새 유형을 기존 유형에 매핑하는 키워드.

EXEC SQL 시작 선언 섹션;
    typedef char mychartype[40];
    typedef long serial_t;
EXEC SQL END 선언 섹션;

또한 다음을 사용할 수도 있습니다.

EXEC SQL TYPE serial_t가 길다;

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

35.4.4.3.4. 포인터

가장 일반적인 유형에 대한 포인터를 선언할 수 있습니다. 그러나 자동 할당 없이는 쿼리의 대상 변수로 포인터를 사용할 수 없습니다. 참조Postgre토토 꽁 머니 : 문서 : 13 : 35.7. 설명자 영역 사용자동 할당에 대한 자세한 내용을 확인하세요.

EXEC SQL 시작 선언 섹션;
    int *intp;
    char **charp;
EXEC SQL END 선언 섹션;

35.4.5. 비원시 SQL 데이터 유형 처리

이 섹션에는 ECPG 응용 프로그램에서 비 스칼라 및 사용자 정의 SQL 수준 데이터 유형을 처리하는 방법에 대한 정보가 포함되어 있습니다. 이는 이전 섹션에서 설명한 비원시 유형의 호스트 배트맨 토토 처리와 다릅니다.

35.4.5.1. 배열

다차원 SQL 수준 배열은 ECPG에서 직접 지원되지 않습니다. 1차원 SQL 레벨 배열은 C 배열 호스트 배트맨 토토에 맵핑될 수 있으며 그 반대의 경우도 마찬가지입니다. 그러나 구문 생성 시 ecpg는 해당 컬럼의 유형을 알지 못하기 때문에 해당 SQL 수준 배열에 C 배열이 입력되었는지 확인할 수 없습니다. SQL 문의 출력을 처리할 때 ecpg는 필요한 정보를 갖고 있으므로 둘 다 배열인지 확인합니다.

쿼리가 접근하는 경우요소배열을 별도로 사용하면 ECPG에서 배열을 사용하지 않아도 됩니다. 그런 다음 요소 유형에 맵핑될 수 있는 유형의 호스트 배트맨 토토를 사용해야 합니다. 예를 들어 열 유형이 배열인 경우정수, 유형의 호스트 배트맨 토토int사용할 수 있습니다. 또한 요소 유형이 다음과 같은 경우varchar또는텍스트, 유형의 호스트 배트맨 토토문자[]또는VARCHAR[]사용할 수 있습니다.

여기에 예가 있습니다. 다음 표를 가정해 보겠습니다.

테이블 t3 생성(
    ii 정수[]
);

testdb= SELECT * FROM t3;
     ii
-------------
 1,2,3,4,5

다음 예제 프로그램은 배열의 4번째 요소를 검색하고 이를 유형의 호스트 배트맨 토토에 저장합니다.int:

EXEC SQL 시작 선언 섹션;
정수 ii;
EXEC SQL END 선언 섹션;

EXEC SQL DECLARE cur1 SELECT ii[4] FROM t3에 대한 커서;
EXEC SQL OPEN cur1;

EXEC SQL을 찾을 수 없을 때 중단하십시오.

동안 (1)

    cur1 INTO에서 EXEC SQL 가져오기 :ii ;
    printf("ii=%d\n", ii);

EXEC SQL CLOSE cur1;

이 예는 다음 결과를 보여줍니다:

ii=4

여러 배열 요소를 배열 유형 호스트 배트맨 토토의 여러 요소에 매핑하려면 배열 열의 각 요소와 호스트 배트맨 토토 배열의 각 요소를 별도로 관리해야 합니다. 예:

EXEC SQL 시작 선언 섹션;
int ii_a[8];
EXEC SQL END 선언 섹션;

t3에서 SELECT ii[1], ii[2], ii[3], ii[4]에 대한 EXEC SQL DECLARE cur1 커서;
EXEC SQL OPEN cur1;

EXEC SQL을 찾을 수 없을 때 중단하십시오.

동안 (1)

    cur1 INTO에서 EXEC SQL 가져오기 :ii_a[0], :ii_a[1], :ii_a[2], :ii_a[3];
    ...

다시 한번 알아두세요

EXEC SQL 시작 선언 섹션;
int ii_a[8];
EXEC SQL END 선언 섹션;

EXEC SQL DECLARE cur1 커서 선택 ii FROM t3;
EXEC SQL OPEN cur1;

EXEC SQL을 찾을 수 없을 때 중단하십시오.

동안 (1)

    /* 틀렸음 */
    cur1 INTO에서 EXEC SQL 가져오기 :ii_a;
    ...

배열 유형 열을 배열 호스트 배트맨 토토에 직접 매핑할 수 없기 때문에 이 경우 올바르게 작동하지 않습니다.

또 다른 해결 방법은 호스트 배트맨 토토 유형의 외부 문자열 표현에 배열을 저장하는 것입니다.문자[]또는VARCHAR[]. 이 표현에 대한 자세한 내용은 다음을 참조하세요.섹션 8.15.2. 이는 호스트 프로그램에서 배열이 자연스럽게 배열로 액세스될 수 없음을 의미합니다(텍스트 표현을 구문 분석하는 추가 처리 없이).

35.4.5.2. 복합 유형

복합 유형은 ECPG에서 직접 지원되지 않지만 쉬운 해결 방법은 가능합니다. 사용 가능한 해결 방법은 위의 배열에 대해 설명한 것과 유사합니다. 즉, 각 속성에 개별적으로 액세스하거나 외부 문자열 표현을 사용하는 것입니다.

다음 예에서는 다음 유형과 테이블을 가정합니다.

CREATE TYPE comp_t AS (intval 정수, textval varchar(32));
CREATE TABLE t4 (compval comp_t);
t4 값에 삽입( (256, 'PostgreSQL') );

가장 확실한 해결책은 각 속성에 개별적으로 액세스하는 것입니다. 다음 프로그램은 유형의 각 속성을 선택하여 예제 테이블에서 데이터를 검색합니다.comp_t별도로:

EXEC SQL 시작 선언 섹션;
int 간격;
varchar 텍스트값[33];
EXEC SQL END 선언 섹션;

/* 복합 유형 열의 각 요소를 SELECT 목록에 넣습니다. */
EXEC SQL DECLARE cur1 CURSOR FOR SELECT (compval).intval, (compval).textval FROM t4;
EXEC SQL OPEN cur1;

EXEC SQL을 찾을 수 없을 때 중단하십시오.

동안 (1)

    /* 복합 유형 열의 각 요소를 호스트 배트맨 토토로 페치합니다. */
    cur1 INTO에서 EXEC SQL 가져오기 :intval, :textval;

    printf("intval=%d, textval=%s\n", intval, textval.arr);

EXEC SQL CLOSE cur1;

이 예를 향상시키기 위해 호스트 배트맨 토토는 값을 저장합니다.가져오기명령은 하나의 구조로 수집될 수 있습니다. 구조 형식의 호스트 배트맨 토토에 대한 자세한 내용은 다음을 참조하세요.섹션 35.4.4.3.2. 구조로 전환하려면 예제를 아래와 같이 수정하면 됩니다. 두 개의 호스트 배트맨 토토,intval그리고텍스트발,의 회원이 되세요comp_t구조이며 구조는에 지정됩니다.가져오기명령.

EXEC SQL 시작 선언 섹션;
typedef 구조체

    int 간격;
    varchar 텍스트값[33];
 comp_t;

comp_t compval;
EXEC SQL END 선언 섹션;

/* 복합 유형 열의 각 요소를 SELECT 목록에 넣습니다. */
EXEC SQL DECLARE cur1 CURSOR FOR SELECT (compval).intval, (compval).textval FROM t4;
EXEC SQL OPEN cur1;

EXEC SQL을 찾을 수 없을 때 중단하십시오.

동안 (1)

    /* SELECT 목록의 모든 값을 하나의 구조에 넣습니다. */
    cur1 INTO에서 EXEC SQL 가져오기 :compval;

    printf("intval=%d, textval=%s\n", compval.intval, compval.textval.arr);

EXEC SQL CLOSE cur1;

구조가 다음에서 사용되지만가져오기명령, 다음의 속성 이름선택절이 하나씩 지정됩니다. 이는 다음을 사용하여 향상될 수 있습니다.*복합 유형 값의 모든 속성을 요청합니다.

...
EXEC SQL DECLARE cur1 CURSOR FOR SELECT(compval).* FROM t4;
EXEC SQL OPEN cur1;

EXEC SQL을 찾을 수 없을 때 중단하십시오.

동안 (1)

    /* SELECT 목록의 모든 값을 하나의 구조에 넣습니다. */
    cur1 INTO에서 EXEC SQL 가져오기 :compval;

    printf("intval=%d, textval=%s\n", compval.intval, compval.textval.arr);

이렇게 하면 ECPG가 복합 유형 자체를 이해하지 못하더라도 복합 유형을 구조에 거의 원활하게 매핑할 수 있습니다.

마지막으로, 유형의 호스트 배트맨 토토에 있는 외부 문자열 표현에 복합 유형 값을 저장할 수도 있습니다.문자[]또는VARCHAR[]. 하지만 그렇게 하면 호스트 프로그램에서 값의 필드에 쉽게 액세스할 수 없습니다.

35.4.5.3. 사용자 정의 기본 유형

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

다음은 데이터 유형을 사용하는 예입니다.복잡한다음 예에서PostgreSQL : 문서 : 13 : 37.13. 사용자 정의 토토 꽁 머니. 해당 유형의 외부 문자열 표현은 다음과 같습니다.(%f,%f), 함수에 정의됨복합체_인()그리고complex_out()함수PostgreSQL : 문서 : 13 : 37.13. 사용자 정의 토토 꽁 머니. 다음 예에서는 복합 유형 값을 삽입합니다.(1,1)그리고(3,3)열에a그리고b, 그 뒤에 있는 표에서 선택하세요.

EXEC SQL 시작 선언 섹션;
    varchar a[64];
    varchar b[64];
EXEC SQL END 선언 섹션;

    EXEC SQL INSERT INTO test_complex VALUES ('(1,1)', '(3,3)');

    EXEC SQL DECLARE cur1 CURSOR FOR SELECT a, b FROM test_complex;
    EXEC SQL OPEN cur1;

    EXEC SQL을 찾을 수 없을 때 중단하십시오.

    동안 (1)

        cur1 INTO에서 EXEC SQL 가져오기 :a, :b;
        printf("a=%s, b=%s\n", a.arr, b.arr);

    EXEC SQL CLOSE cur1;

이 예는 다음 결과를 보여줍니다:

a=(1,1), b=(3,3)

또 다른 해결 방법은 ECPG에서 사용자 정의 유형을 직접 사용하는 것을 피하고 대신 사용자 정의 유형과 ECPG가 처리할 수 있는 기본 유형 간에 변환하는 함수나 캐스트를 생성하는 것입니다. 그러나 유형 캐스트, 특히 암시적 유형 캐스트는 유형 시스템에 매우 신중하게 도입되어야 합니다.

예를 들어,

CREATE FUNCTION create_complex(r double, i double) RETURNS complex
언어 SQL
불변
AS $$ SELECT $1 * 복소수 '(1,0')' + $2 * 복소수 '(0,1)' $$;

이 정의 이후에는 다음과 같습니다

EXEC SQL 시작 선언 섹션;
더블 a, b, c, d;
EXEC SQL END 선언 섹션;

a = 1;
b = 2;
c = 3;
d = 4;

EXEC SQL INSERT INTO test_complex VALUES (create_complex(:a, :b), create_complex(:c, :d));

와 같은 효과가 있습니다

EXEC SQL INSERT INTO test_complex VALUES ('(1,2)', '(3,4)');

35.4.6. 지표

위의 예는 null 값을 처리하지 않습니다. 실제로 검색 예제는 데이터베이스에서 null 값을 가져오면 오류를 발생시킵니다. 널값을 데이터베이스에 전달하거나 데이터베이스에서 널값을 검색하려면 데이터가 포함된 각 호스트 배트맨 토토에 두 번째 호스트 배트맨 토토 스펙을 추가해야 합니다. 이 두 번째 호스트 배트맨 토토는표시자그리고 데이터가 null인지 여부를 알려주는 플래그를 포함합니다. 이 경우 실제 호스트 배트맨 토토의 값은 무시됩니다. 다음은 null 값 검색을 올바르게 처리하는 예입니다.

EXEC SQL 시작 선언 섹션;
VARCHAR 발;
int val_ind;
EXEC SQL 끝 선언 섹션:

 ...

EXEC SQL SELECT b INTO :val :val_ind FROM test1;

표시배트맨 토토val_ind값이 null이 아니면 0이 되고 값이 null이면 음수가 됩니다. (참조PostgreSQL : 문서 : 13 : 35.16. Oracle 호환성 스포츠 토토 사이트Oracle 특정 동작을 활성화합니다.)

표시기에는 또 다른 기능이 있습니다. 표시기 값이 양수이면 값이 null이 아니지만 호스트 배트맨 토토에 저장될 때 잘렸음을 의미합니다.

인수인 경우-r no_indicator전처리기로 전달됩니다.ecpg, 작동합니다표시 없음모드. 표시기 없음 모드에서 표시기 변수가 지정되지 않은 경우 널값은 입력 및 출력에서 문자열 유형에 대해 빈 문자열로, 정수 유형에 대해 유형에 대해 가능한 가장 낮은 값으로 신호됩니다(예:INT_MINforint).

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.