ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 33.9\. 预处理器指令 可用的几种预处理器指令, 它修改`ecpg`预处理器分析方式以及处理文件方式。 ## 33.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` 指令。 > **Note:** 包含文件名大小写敏感,即使其余的`EXEC SQL INCLUDE` 命令遵循正常的SQL大小写敏感规则。 ## 33.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预编译器不能看到这个声明。 ## 33.9.3\. ifdef,ifndef,else,elif和endif指令 你可以使用下面指令有条件地编译代码段: `EXEC SQL ifdef` `_name_`; 如果`_name_`已经和`EXEC SQL define` `_name_`被创建,那么检查`_name_`并处理 随后行。 `EXEC SQL ifndef` `_name_`; 如果`_name_`和`EXEC SQL define` `_name_` _没有_被创建, 那么检查`_name_`并处理 随后行。 `EXEC SQL else;` 开始处理另一部分到 `EXEC SQL ifdef` `_name_`或者 `EXEC SQL ifndef` `_name_`介绍的部分。 `EXEC SQL elif` `_name_`; 如果`_name_`和`EXEC SQL define` `_name_`已经被创建, 那么检查`_name_`并且开始另一部分。 `EXEC SQL endif;` 结束另一部分。 例子: ``` EXEC SQL ifndef TZVAR; EXEC SQL SET TIMEZONE TO 'GMT'; EXEC SQL elif TZNAME; EXEC SQL SET TIMEZONE TO TZNAME; EXEC SQL else; EXEC SQL SET TIMEZONE TO TZVAR; EXEC SQL endif; ```