이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 34.4. 호스트 사설 토토 사용버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

30.6. 호스트 변수 토토

Postgre토토 커뮤니티 : 문서 : 8.1 : 토토 커뮤니티 토토 커뮤니티당신은 어떻게 했는지 보셨죠 Embedded SQL 프로그램에서 SQL문을 실행할 수 있습니다. 일부 그 진술 중 고정된 값만 사용했으며 사용자가 제공한 값을 명령문에 삽입하거나 프로그램은 쿼리에서 반환된 값을 처리합니다. 그런 종류의 문은 실제 응용 프로그램에서는 실제로 유용하지 않습니다. 이 섹션에서는 C 간에 데이터를 전달하는 방법을 자세히 설명합니다. 간단한 메커니즘을 사용하여 프로그램 및 내장 SQL 문 전화함호스트 변수.

30.6.1. 개요

C 프로그램과 SQL 문 사이에 데이터를 전달하는 것은 특히 임베디드 SQL에서는 간단합니다. 갖는 대신 프로그램은 데이터를 명령문에 붙여넣습니다. 값을 올바르게 인용하는 등의 다양한 문제로 인해 간단히 C 변수의 이름을 SQL에 쓸 수 있습니다. 콜론이 앞에 붙은 명령문입니다. 예를 들면:

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

이 문은 두 개의 C 변수를 참조합니다.v1그리고v2또한 다음을 사용합니다. 일반 SQL 문자열 리터럴. 한 종류의 데이터만 사용하도록 제한되어 있습니다.

SQL 문에 C 변수를 삽입하는 이 스타일이 작동합니다. SQL 문에서 값 식이 필요한 모든 위치에 있습니다. 에서 우리가 C 변수에 대한 참조라고 부르는 SQL 환경호스트 변수.

30.6.2. 섹션 선언

예를 들어 프로그램에서 데이터베이스로 데이터를 전달하려면 쿼리의 매개변수로 사용하거나 데이터베이스에서 데이터를 전달하기 위해 프로그램으로 돌아가서, 의도된 C 변수 이 데이터가 포함되어 있으면 특별히 표시된 부분에 선언해야 합니다. 섹션을 포함하므로 Embedded SQL 전처리기가 이를 인식하게 됩니다. 그들.

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

EXEC SQL 시작 선언 섹션;

다음으로 끝남

EXEC SQL END 선언 섹션;

이 줄 사이에는 일반 C 변수가 있어야 합니다. 선언(예:

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

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

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

구조체 또는 공용체의 정의도 나열되어야 합니다. 내부에선언섹션. 그렇지 않으면 전처리기는 이러한 유형을 처리할 수 없습니다. 정의를 알아라.

특수 유형VARCHAR변환됨 이름이 붙은구조체모든 변수에 대해. 에이 다음과 같은 선언

VARCHAR 변수[180];

다음으로 변환됨

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

이 구조는 SQL 데이텀과의 인터페이스에 적합합니다. 유형varchar.

30.6.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 테스트;

 ...

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

여기는INTO다음에 절이 나타남 모든 일반 조항.

이 두 가지 방법 모두 한 번에 한 행만 검색할 수 있습니다. 시간. 잠재적으로 결과 집합을 처리해야 하는 경우 두 개 이상의 행을 포함하는 경우 표시된 대로 커서를 토토해야 합니다. 두 번째 예에서는.

30.6.4. 지표

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

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