提供了一些預處理器指令,用於修改 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 DEFINEnamevalue;
所以您可以定義一個名稱
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 這個名稱或識別符號。請注意,您不能為將在嵌入式 SQL 查詢中使用的常量使用 #define,因為在這種情況下,嵌入式 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 或 nameEXEC SQL ifndef 指令後開始一個可選的替代部分。可以出現任意數量的 nameelif 部分。如果 name 已定義 並且 同一 ifdef/ifndef...endif 結構中的前一個部分未被處理,則處理 elif 後續的行。
EXEC SQL else; #在 EXEC SQL ifdef 或 nameEXEC SQL ifndef 指令後開始一個可選的最終替代部分。如果同一 nameifdef/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;
如果您在文件中看到任何不正確、與您對特定功能的經驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。