支持的版本: 当前 (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 指令来包含其他头文件。

注意

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,如果已通过 EXEC SQL define name 定义了 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;

提交更正

如果您发现文档中有任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。