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

34.9. 前置處理器指令 #

有幾個前置處理器指令可用於修改 ecpg 前置處理器剖析和處理檔案的方式。

34.9.1. 包含檔案 #

若要將外部檔案包含到您的嵌入式 SQL 程式中,請使用

EXEC SQL INCLUDE filename;
EXEC SQL INCLUDE <filename>;
EXEC SQL INCLUDE "filename";

嵌入式 SQL 前置處理器會尋找名為 filename.h 的檔案,对其進行前置處理,並將其包含在產生的 C 輸出中。 因此,包含檔案中的嵌入式 SQL 陳述式將被正確處理。

ecpg 前置處理器將按照以下順序在多個目錄中搜尋檔案

  • 目前目錄
  • /usr/local/include
  • PostgreSQL 包含目錄,在建置時定義(例如,/usr/local/pgsql/include
  • /usr/include

但是,當使用 EXEC SQL INCLUDE "filename" 時,只會搜尋目前目錄。

在每個目錄中,前置處理器將首先按給定的檔案名稱進行搜尋,如果找不到,將在檔案名稱後面附加 .h 並再次嘗試(除非指定的檔案名稱已具有該後綴)。

請注意,EXEC SQL INCLUDE

#include <filename.h>

不同,因為該檔案將不受 SQL 命令前置處理的影響。 自然地,您可以繼續使用 C 的 #include 指令來包含其他標頭檔。

注意

包含檔案名稱區分大小寫,即使 EXEC SQL INCLUDE 命令的其餘部分遵循正常的 SQL 大小寫規則。

34.9.2. define 和 undef 指令 #

與 C 語言中已知的指令 #define 類似,嵌入式 SQL 也有類似的概念

EXEC SQL DEFINE name;
EXEC SQL DEFINE name 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 DEFINEEXEC SQL UNDEF 的影響不會跨檔案傳遞:每個檔案都以僅由命令列上的 -D 參數定義的符號開始。

34.9.3. ifdef、ifndef、elif、else 和 endif 指令 #

您可以使用以下指令有條件地編譯程式碼區段

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 name 指令之後開始一個可選的替代區段。 可以出現任意數量的 elif 區段。 如果 name 已定義 未處理相同 ifdef/ifndef...endif 結構的先前區段,則處理 elif 後面的行。

EXEC SQL else; #

EXEC SQL ifdef nameEXEC 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;

提交修正

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