本節說明 ECPG 內部是如何運作的。這些資訊偶爾可能對使用者理解如何使用 ECPG 有所幫助。
由 ecpg
寫入到輸出的前四行是固定的行。兩個是註解,兩個是連接到函式庫介面所必需的 include 行。然後,前置處理器讀取檔案並寫入輸出。通常,它只會將所有內容迴音到輸出。
當它看到 EXEC SQL
陳述式時,它會介入並更改它。命令以 EXEC SQL
開頭,並以 ;
結尾。中間的所有內容都被視為一個SQL陳述式,並剖析變數替換。
當符號以冒號 (:
) 開頭時,就會發生變數替換。具有該名稱的變數會在先前在 EXEC SQL DECLARE
區段中宣告的變數中查詢。
函式庫中最重要的函式是 ECPGdo
,它負責執行大多數命令。它接受可變數量的引數。這很容易加總到 50 個左右的引數,我們希望這在任何平台上都不是問題。
這些引數是
對於每個作為SQL命令一部分的變數,函式會取得十個引數
作為特殊符號的類型。
值的指標或指標的指標。
如果它是 char
或 varchar
,則變數的大小。
陣列中的元素數量(用於陣列提取)。
陣列中下一個元素的偏移量(用於陣列提取)。
指示器變數的類型,作為特殊符號。
指示器變數的指標。
0
指示器陣列中的元素數量(用於陣列提取)。
指示器陣列中下一個元素的偏移量(用於陣列提取)。
請注意,並非所有 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"
(此處的縮排是為了提高可讀性,而不是前置處理器所做的。)
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符,或需要進一步澄清之處,請使用此表單來回報文件問題。