支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

34.17. 內部 #

本節說明 ECPG 內部是如何運作的。這些資訊偶爾可能對使用者理解如何使用 ECPG 有所幫助。

ecpg 寫入到輸出的前四行是固定的行。兩個是註解,兩個是連接到函式庫介面所必需的 include 行。然後,前置處理器讀取檔案並寫入輸出。通常,它只會將所有內容迴音到輸出。

當它看到 EXEC SQL 陳述式時,它會介入並更改它。命令以 EXEC SQL 開頭,並以 ; 結尾。中間的所有內容都被視為一個SQL陳述式,並剖析變數替換。

當符號以冒號 (:) 開頭時,就會發生變數替換。具有該名稱的變數會在先前在 EXEC SQL DECLARE 區段中宣告的變數中查詢。

函式庫中最重要的函式是 ECPGdo,它負責執行大多數命令。它接受可變數量的引數。這很容易加總到 50 個左右的引數,我們希望這在任何平台上都不是問題。

這些引數是

行號 #

這是原始行的行號;僅用於錯誤訊息。

字串 #

這是SQL要發出的命令。它由輸入變數修改,也就是說,在編譯時未知但在命令中輸入的變數。字串包含 ?,表示變數應該去哪裡。

輸入變數 #

每個輸入變數都會產生十個引數。(見下文。)

ECPGt_EOIT #

一個 enum,表示沒有更多輸入變數。

輸出變數 #

每個輸出變數都會產生十個引數。(見下文。) 這些變數由函式填入。

ECPGt_EORT #

一個 enum,表示沒有更多變數。

對於每個作為SQL命令一部分的變數,函式會取得十個引數

  1. 作為特殊符號的類型。

  2. 值的指標或指標的指標。

  3. 如果它是 charvarchar,則變數的大小。

  4. 陣列中的元素數量(用於陣列提取)。

  5. 陣列中下一個元素的偏移量(用於陣列提取)。

  6. 指示器變數的類型,作為特殊符號。

  7. 指示器變數的指標。

  8. 0

  9. 指示器陣列中的元素數量(用於陣列提取)。

  10. 指示器陣列中下一個元素的偏移量(用於陣列提取)。

請注意,並非所有 SQL 命令都以這種方式處理。例如,像這樣的 open cursor 陳述式

EXEC SQL OPEN cursor;

不會複製到輸出。相反,cursor 的 DECLARE 命令會用在 OPEN 命令的位置,因為它實際上打開了 cursor。

以下是一個完整的範例,描述了檔案 foo.pgc 的前置處理器的輸出(詳細資訊可能會隨著前置處理器的每個特定版本而改變)

EXEC SQL BEGIN DECLARE SECTION;
int index;
int result;
EXEC SQL END DECLARE SECTION;
...
EXEC SQL SELECT res INTO :result FROM mytable WHERE index = :index;

被翻譯成

/* Processed by ecpg (2.6.0) */
/* These two include files are added by the preprocessor */
#include <ecpgtype.h>;
#include <ecpglib.h>;

/* exec sql begin declare section */

#line 1 "foo.pgc"

 int index;
 int result;
/* exec sql end declare section */
...
ECPGdo(__LINE__, NULL, "SELECT res FROM mytable WHERE index = ?     ",
        ECPGt_int,&(index),1L,1L,sizeof(int),
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
        ECPGt_int,&(result),1L,1L,sizeof(int),
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 147 "foo.pgc"

(此處的縮排是為了提高可讀性,而不是前置處理器所做的。)

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符,或需要進一步澄清之處,請使用此表單來回報文件問題。