에Postgre롤 토토 : 문서 : 8.4 : 실행 실행당신은 어떻게 했는지 보셨죠 Embedded SQL 프로그램에서 SQL문을 실행할 수 있습니다. 일부 그 진술 중 고정된 값만 사용했으며 사용자가 제공한 값을 명령문에 삽입하거나 프로그램은 쿼리에서 반환된 값을 처리합니다. 그런 종류의 문은 실제 응용 프로그램에서는 실제로 유용하지 않습니다. 이것 섹션에서는 C 간에 데이터를 전달하는 방법을 자세히 설명합니다. 간단한 메커니즘을 사용하여 프로그램 및 내장 SQL 문 라고 불리는호스트 토토 커뮤니티. 임베디드에서는 우리가 SQL 문이라고 생각하는 SQL 프로그램은 다음과 같습니다.손님C 프로그램 코드에서호스트 언어. 따라서 토토 커뮤니티 C 프로그램이 호출됩니다.호스트 토토 커뮤니티.
C 프로그램과 SQL 문 사이에 데이터를 전달하는 것은 특히 임베디드 SQL에서는 간단합니다. 갖는 대신 프로그램은 데이터를 명령문에 붙여넣습니다. 값을 올바르게 인용하는 등의 다양한 문제로 인해 간단히 C 변수의 이름을 SQL에 쓸 수 있습니다. 콜론이 앞에 붙은 명령문입니다. 예를 들어:
EXEC SQL INSERT INTO sometable VALUES (:v1, 'foo', :v2);
이 명령문은 두 개의 C 토토 커뮤니티를 참조합니다.v1그리고v2또한 다음을 사용합니다. 일반 SQL 문자열 리터럴. 한 종류의 데이터만 사용하도록 제한되어 있습니다.
SQL 문에 C 변수를 삽입하는 이 스타일이 작동합니다. SQL에서 값 표현식이 필요한 모든 위치 성명.
예를 들어 프로그램에서 데이터베이스로 데이터를 전달하려면 쿼리의 매개변수로 사용하거나 데이터베이스에서 데이터를 전달하기 위해 프로그램으로 돌아가서, 의도된 C 변수 이 데이터가 포함되어 있으면 특별히 표시된 부분에 선언해야 합니다. 섹션을 포함하므로 Embedded SQL 전처리기가 이를 인식하게 됩니다. 그들을.
이 섹션은 다음으로 시작됩니다:
EXEC SQL 시작 선언 섹션;
그리고 다음으로 끝납니다:
EXEC SQL END 선언 섹션;
이 줄 사이에는 일반 C 변수가 있어야 합니다. 다음과 같은 선언:
int x = 4; char foo[16], bar[16];
보시다시피 선택적으로 초기값을 할당할 수 있습니다 변수에. 변수의 범위는 다음에 의해 결정됩니다. 프로그램 내에서 선언 섹션의 위치입니다. 당신은 할 수 있습니다 또한 다음 구문을 사용하여 변수를 선언합니다. 암시적으로 선언 섹션을 생성합니다.
EXEC SQL int i = 4;
당신은 프로그램에 선언 섹션을 원하는 만큼 가질 수 있습니다 좋다.
선언은 다음과 같이 출력 파일에도 반영됩니다. 일반 C 변수이므로 다시 선언할 필요가 없습니다. SQL 명령에 사용되지 않는 변수는 다음과 같습니다. 일반적으로 이러한 특수 섹션 외부에서 선언됩니다.
구조체 또는 공용체의 정의도 나열되어야 합니다. 내부에선언섹션. 그렇지 않으면 전처리기는 이러한 유형을 처리할 수 없습니다. 정의를 알아라.
호스트 토토 커뮤니티로 배열, 형식 정의, 구조체와 포인터. 게다가 특별한 유형의 호스트가 있습니다. ECPG에만 존재하는 변수입니다.
호스트 토토 커뮤니티에 대한 몇 가지 예:
배열 선언의 가장 일반적인 용도 중 하나는 다음과 같습니다. 아마도 다음과 같이 char 배열을 할당했을 것입니다.
EXEC SQL 시작 선언 섹션;
문자 문자열[50];
EXEC SQL END 선언 섹션;
다음의 길이에 주의해야 한다는 점에 유의하세요. 당신 자신. 이 호스트 토토 커뮤니티를 대상으로 사용하는 경우 이상의 문자열을 반환하는 쿼리의 변수 49자, 버퍼 오버플로가 발생합니다.
다음을 사용하세요typedef키워드 새로운 유형을 기존 유형에 매핑합니다.
EXEC SQL 시작 선언 섹션;
typedef char mychartype[40];
typedef long serial_t;
EXEC SQL END 선언 섹션;
또한 다음을 사용할 수도 있습니다.
EXEC SQL TYPE serial_t는 길다.
이 선언은 선언의 일부일 필요는 없습니다. 부분.
가장 일반적인 유형에 대한 포인터를 선언할 수 있습니다. 그러나 포인터를 대상으로 사용할 수는 없습니다. 자동 할당이 없는 쿼리 변수. 보다PostgreSQL : 문서 : 8.4 : SQL 무지개 토토 영역 사용용 자동 할당에 대해 자세히 알아보세요.
EXEC SQL 시작 선언 섹션;
int *intp;
char **charp;
EXEC SQL END 선언 섹션;
ECPG에는 다음을 수행하는 데 도움이 되는 몇 가지 특별한 유형이 포함되어 있습니다. SQL 서버의 데이터와 쉽게 상호 작용합니다. 을 위한 예를 들어 다음과 같은 지원을 구현했습니다.varchar, 숫자, 날짜, 타임스탬프및간격유형.토토 핫 : 문서 : 8.4 : PGTYPES 라이브러리다음과 같은 유형을 처리하는 기본 기능이 포함되어 있습니다. SQL Server에 쿼리를 보낼 필요가 없습니다. 타임스탬프에 간격을 추가하기 위한 것입니다. 예.
특수 유형VARCHAR이다 명명된으로 변환됨구조체용 모든 변수. 다음과 같은 선언:
VARCHAR var[180];
다음으로 변환됩니다:
struct varchar_var int len; 문자 arr[180]; 변수;
이 구조는 SQL과의 인터페이스에 적합합니다. 유형의 데이텀varchar.
이제 귀하는 귀하가 생성한 데이터를 전달할 수 있습니다. 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절은 다음에 나타납니다. 모든 일반 조항.
이 두 방법 모두 한 번에 한 행만 검색할 수 있습니다. 시간. 잠재적으로 결과 집합을 처리해야 하는 경우 두 개 이상의 행을 포함하는 경우 표시된 대로 커서를 사용해야 합니다. 두 번째 예에서는.
위의 예는 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이었음을 의미합니다. 호스트 토토 커뮤니티에 저장될 때 잘렸습니다.