有幾個前置處理器指令可用於修改 ecpg
前置處理器剖析和處理檔案的方式。
若要將外部檔案包含到您的嵌入式 SQL 程式中,請使用
EXEC SQL INCLUDEfilename
; EXEC SQL INCLUDE <filename
>; EXEC SQL INCLUDE "filename
";
嵌入式 SQL 前置處理器會尋找名為
的檔案,对其進行前置處理,並將其包含在產生的 C 輸出中。 因此,包含檔案中的嵌入式 SQL 陳述式將被正確處理。filename
.h
ecpg
前置處理器將按照以下順序在多個目錄中搜尋檔案
/usr/local/include
/usr/local/pgsql/include
)/usr/include
但是,當使用 EXEC SQL INCLUDE "
時,只會搜尋目前目錄。filename
"
在每個目錄中,前置處理器將首先按給定的檔案名稱進行搜尋,如果找不到,將在檔案名稱後面附加 .h
並再次嘗試(除非指定的檔案名稱已具有該後綴)。
請注意,EXEC SQL INCLUDE
與
#include <filename
.h>
不同,因為該檔案將不受 SQL 命令前置處理的影響。 自然地,您可以繼續使用 C 的 #include
指令來包含其他標頭檔。
包含檔案名稱區分大小寫,即使 EXEC SQL INCLUDE
命令的其餘部分遵循正常的 SQL 大小寫規則。
與 C 語言中已知的指令 #define
類似,嵌入式 SQL 也有類似的概念
EXEC SQL DEFINEname
; EXEC SQL DEFINEname
value
;
因此您可以定義一個名稱
EXEC SQL DEFINE HAVE_FEATURE;
您也可以定義常數
EXEC SQL DEFINE MYNUMBER 12; EXEC SQL DEFINE MYSTRING 'abc';
使用 undef
移除先前的定義
EXEC SQL UNDEF MYNUMBER;
當然,您可以繼續在嵌入式 SQL 程式中使用 C 版本 #define
和 #undef
。 區別在於您的定義值在何處求值。 如果您使用 EXEC SQL DEFINE
,則 ecpg
前置處理器會評估定義並替換值。 例如,如果您撰寫
EXEC SQL DEFINE MYNUMBER 12; ... EXEC SQL UPDATE Tbl SET col = MYNUMBER;
那麼 ecpg
將已完成替換,您的 C 編譯器將永遠不會看到任何名稱或識別碼 MYNUMBER
。 請注意,您不能將 #define
用於您將在嵌入式 SQL 查詢中使用的常數,因為在這種情況下,嵌入式 SQL 前置編譯器無法看到此宣告。
如果在 ecpg
前置處理器的命令列上指定了多個輸入檔,則 EXEC SQL DEFINE
和 EXEC SQL UNDEF
的影響不會跨檔案傳遞:每個檔案都以僅由命令列上的 -D
參數定義的符號開始。
您可以使用以下指令有條件地編譯程式碼區段
EXEC SQL ifdef name
;
#檢查 name
,如果 name
已通過 EXEC SQL define
定義,則處理後續行。name
EXEC SQL ifndef name
;
#檢查 name
,如果 name
尚未通過 EXEC SQL define
定義,則處理後續行。name
EXEC SQL elif name
;
#在 EXEC SQL ifdef
或 name
EXEC SQL ifndef
指令之後開始一個可選的替代區段。 可以出現任意數量的 name
elif
區段。 如果 name
已定義 且 未處理相同 ifdef
/ifndef
...endif
結構的先前區段,則處理 elif
後面的行。
EXEC SQL else;
#在 EXEC SQL ifdef
或 name
EXEC SQL ifndef
指令之後開始一個可選的最終替代區段。 如果未處理相同 name
ifdef
/ifndef
...endif
結構的先前區段,則處理後續行。
EXEC SQL endif;
#結束 ifdef
/ifndef
...endif
結構。 正常處理後續行。
ifdef
/ifndef
...endif
結構可以巢狀,最多 127 層。
這個範例會編譯三個 SET TIMEZONE
指令中的其中一個
EXEC SQL ifdef TZVAR; EXEC SQL SET TIMEZONE TO TZVAR; EXEC SQL elif TZNAME; EXEC SQL SET TIMEZONE TO TZNAME; EXEC SQL else; EXEC SQL SET TIMEZONE TO 'GMT'; EXEC SQL endif;
如果您在文件中發現任何不正確之處、與您使用特定功能的經驗不符,或需要進一步澄清,請使用此表格回報文件問題。