| 포스트그레토토 결과 | ||
|---|---|---|
| 이전 | 43장. ecpg - C에 삽입된 토토 결과 | 다음 |
이 섹션은 Ecpg를 개발하려는 사람들을 위한 것입니다. 인터페이스. 일이 어떻게 작동하는지 설명합니다. 야망은 이 섹션에 보고 싶은 사람들을 위한 내용이 포함되도록 만드세요. 내부 및 사용 방법에 대한 섹션은 모든 사람에게 충분해야 합니다. 정상적인 질문. 그러니 내부를 살펴보기 전에 이 글을 읽어보세요. 심전도. 실제로 어떻게 작동하는지 관심이 없다면 건너뛰세요. 이 섹션.
이 버전의 전처리기에는 몇 가지 결함이 있습니다.
변수는 정적이어야 합니다.
당신이 쓰는 것은 무엇이든 거의 정확하게 다음으로 복사됩니다. Postgres를 사용하면 오류를 찾을 수 없습니다. 런타임.
PQ 인터페이스와 무엇보다도 PQexec 기능은 ecpg에서 사용되는 요청은 다음과 같이 구성됩니다. 문자열. 데이터에 null이 포함된 경우와 같은 일부 경우에는 성격상 심각한 문제가 될 것 같습니다.
각 항목마다 다른 오류 번호가 있어야 합니다. 모두에 대해 -1 대신 오류가 발생합니다.
to_date 외.
선언에서 레코드나 구조를 정의할 가능성 섹션의 한 행에서 레코드를 채울 수 있는 방식으로 데이터베이스.
이것은 한 번에 전체 행을 처리하는 더 간단한 방법입니다.
오라클은 속도를 향상시키는 어레이 작업을 제공합니다. 언제 ecpg에서 구현하는 것은 호환성 이유로 수행됩니다. 만. 속도를 향상하려면 훨씬 더 많은 것이 필요합니다 Postgres 내부 메커니즘에 대한 통찰력은 나보다 더 뛰어납니다.
Oracle에는 값이 null인지 알려주는 표시 변수가 있습니다. 또는 비어 있는 경우. 이는 어레이 작업을 크게 단순화하고 일부 디자인 결함을 해킹할 수 있는 방법을 제공합니다. VARCHAR2 처리(빈 문자열이 아닌 것처럼) null 값과 구별 가능). 이것이 맞는지 잘 모르겠습니다. Oracle 확장 또는 ANSI 표준의 일부입니다.
레코드 및 배열과 같은 복잡한 유형뿐만 아니라 유형 정의 잘 챙겨두시면 좋을 것 같아요.
데이터베이스를 설정하려면 테이블이 포함된 몇 가지 스크립트가 필요합니다 정의 및 기타 구성 매개변수. 만약 당신이 적용하려는 이전 데이터베이스에 대한 이러한 스크립트 동일한 방식으로 작동하는 Postgres 데이터베이스를 얻으려고 합니다.
데이터베이스를 설정하려면 테이블이 포함된 몇 가지 스크립트가 필요합니다 정의 및 기능은 다음을 통해 수행할 수 있습니다. 일부 변환 스크립트. 속도는 결코 달성되지 않습니다. 이쪽으로. 이를 위해서는 데이터베이스에 대한 더 큰 통찰력이 필요합니다. 실현 가능한 것보다 데이터베이스의 구축 및 사용 스크립트에서.
처음 네 줄이 출력에 기록됩니다. 댓글 2개와 2개 라이브러리 인터페이스에 필요한 줄을 포함합니다.
그런 다음 전처리기는 입력을 읽는 한 번만 작동합니다. 파일을 작성하고 진행되는 대로 출력에 씁니다. 보통은 그냥 더 이상 살펴보지 않고 모든 것을 출력에 반영합니다.
에 관해서는EXEC 토토 결과문장 그것은 그것이 무엇인지에 따라 개입하고 변화시킵니다.EXEC 토토 결과문은 다음 중 하나일 수 있습니다:
다음으로 시작하는 섹션 선언
exec 토토 결과 선언 섹션 시작;다음으로 끝남
exec 토토 결과 end 선언 섹션;섹션에서는 변수 선언만 허용됩니다. 매 이 섹션 내의 변수 선언은 목록에도 입력됩니다. 해당 변수와 함께 이름에 색인이 붙은 변수 유형.
선언은 변수를 만들기 위해 파일에 반향됩니다. 일반 C-변수도 마찬가지입니다.
특수 유형 VARCHAR 및 VARCHAR2는 모든 변수에 대해 구조체라는 이름을 붙였습니다. 다음과 같은 선언:
VARCHAR 변수[180];다음으로 변환됩니다
struct varchar_var int len; 문자 arr[180]; 변수;
include 문은 다음과 같습니다:
exec 토토 결과 include 파일 이름;다음으로 변환됩니다.
#include <파일 이름.h
연결 문은 다음과 같습니다:
exec 토토 결과 연결 '데이터베이스';그 진술은 다음으로 변환됩니다.
ECPGconnect("데이터베이스");
열린 커서 문은 다음과 같습니다:
exec 토토 결과 열기커서;무시되며 출력에서 복사되지 않습니다.
커밋 문은 다음과 같습니다.
exec 토토 결과 커밋;그리고 출력에서 다음으로 번역됩니다.
ECPG커밋(__LINE__);
롤백 문은 다음과 같습니다
exec 토토 결과 롤백;그리고 출력에서 다음으로 번역됩니다.
ECPGrollback(__LINE__);
다른 SQL 문은 다음으로 시작하는 다른 문입니다.exec 토토 결과다음으로 끝남;. 그 사이의 모든 내용은 토토 결과로 처리됩니다. 명령문을 작성하고 변수 대체를 위해 구문 분석했습니다.
기호가 다음으로 시작하면 변수 대체가 발생합니다. 콜론(:). 그런 다음 그 변수 이전에 선언된 변수 중에서 이름이 발견되었습니다. 선언 섹션 내에서 그리고 여부에 따라 SQL 문은 입력 또는 출력을 위한 변수임을 알고 있습니다. 변수에 대한 포인터는 출력에 기록됩니다. 기능에 의한 접근을 허용합니다.
토토 결과 요청의 일부인 모든 변수에 대해 함수는 또 다른 5개의 인수를 얻습니다.
| 특수 기호로서의 유형 |
| 값에 대한 포인터 |
| varchar인 경우 변수의 크기 |
| 배열의 요소 수(배열의 경우) 가져오기) |
| 배열의 다음 요소에 대한 오프셋(배열의 경우) 가져오기) |
배열 가져오기가 아직 구현되지 않았으므로 마지막 두 개는 논쟁은 그다지 중요하지 않습니다. 그들은 아마도 그럴 수도 있었을 것이다 제외되었습니다.
다음은 출력을 설명하는 완전한 예입니다. 전처리기:
exec 토토 결과 선언 섹션 시작;
정수 인덱스;
정수 결과;
exec 토토 결과 end 선언 섹션;
...
exec 토토 결과 select res into :result from mytable where index = :index;다음으로 번역됩니다:/* 이 두 개의 포함 파일은 전처리기에 의해 추가됩니다 */
#include <ecpgtype.h
#include <ecpglib.h
/* exec 토토 결과 선언 섹션 시작 */
정수 인덱스;
정수 결과;
/* exec 토토 결과 선언 섹션 끝 */
...
ECPGdo(__LINE__, "인덱스 = ;;인 mytable에서 res를 선택하세요.",
ECPGt_int,&index,0,0,sizeof(int),
ECPGt_EOIT,
ECPGt_int,&result,0,0,sizeof(int),
ECPGt_EORT );(이 설명서의 들여쓰기는 가독성을 위해 추가되었으며
전처리기가 할 수 있는 일이 아닙니다.)라이브러리에서 가장 중요한 기능은ECPGdo함수. 다양한 양의 비용이 소요됩니다. 인수. 우리는 제한이 있는 기계를 만나지 않기를 바랍니다. varchar 함수가 허용할 수 있는 변수의 양. 이렇게 하면 최대 50개 정도의 인수를 쉽게 추가할 수 있습니다.
인수는 다음과 같습니다:
이것은 오류에 사용된 원래 라인의 라인 번호입니다 메시지만 해당됩니다.
이것은 발행될 SQL 요청입니다. 이 요청 입력 변수, 즉 입력 변수에 의해 수정됩니다. 컴파일 타임에는 알려지지 않았지만 요청. 변수가 어디로 가야하는지 문자열에는 다음이 포함됩니다. “;”.
전처리기에 대한 섹션에 설명된 대로 입력 변수는 5개의 인수를 얻습니다.
더 이상 입력 변수가 없음을 알려주는 열거형입니다.
전처리기에 대한 섹션에 설명된 대로 입력 변수는 5개의 인수를 얻습니다. 이 변수는 채워져 있습니다. 기능으로.
더 이상 변수가 없음을 알려주는 열거형입니다.
모든 SQL 문은 다음을 제외하고 하나의 트랜잭션에서 수행됩니다. 커밋 트랜잭션을 발행합니다. 이것은 첫 번째로 작동합니다. 트랜잭션 또는 커밋이나 롤백 이후의 첫 번째 트랜잭션은 항상 거래.
완료 예정: 다른 항목을 설명하는 항목.
| 이전 | 홈 | 다음 |
| 설치 | 위로 | libpq |