2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 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 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 大小寫敏感規則。

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 這個名稱或識別符號。請注意,您不能為將在嵌入式 SQL 查詢中使用的常量使用 #define,因為在這種情況下,嵌入式 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;

提交更正

如果您在文件中看到任何不正確、與您對特定功能的經驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。