提供了一些預處理器指令,用於修改 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
這個名稱或識別符號。請注意,您不能為將在嵌入式 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
或 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;
如果您在文件中看到任何不正確、與您對特定功能的經驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。