Postgresql 中文操作指南

36.9. Preprocessor Directives #

有些可用的预处理器指令会改变 ecpg 预处理器如何解析和处理文件。

36.9.1. Including Files #

要将外部文件包含到嵌入式 SQL 程序中,请使用:

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

嵌入式 SQL 预处理器会查找名为 _filename .h_ 的文件,对它进行预处理并将其包含到生成的 C 输出中。因此,在所包含的文件中的嵌入式 SQL 语句得到正确处理。

ecpg 预处理器将按照如下顺序搜索几个目录中的文件:

但是,当使用 EXEC SQL INCLUDE "_filename_ 时,只会搜索当前目录。

在每个目录中,预处理器将首先查找给定的文件名称,如果没有找到,将会在文件名后追加 .h 再试一次(除非指定的文件名已经具有该后缀)。

请注意,EXEC SQL INCLUDEnot 相同:

#include <filename.h>

因为该文件不会受到 SQL 命令预处理。自然地,你可以继续使用 C #include 指令来包含其他头文件。

Note

包含的文件名区分大小写,即使_EXEC SQL INCLUDE_命令的其他部分遵循正常的 SQL 大小写规则。

36.9.2. The define and undef Directives #

类似于 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 交换机在命令行上定义的符号开始。

36.9.3. ifdef, ifndef, elif, else, and endif Directives #

可以使用以下指令以有条件地编译代码部分:

  • EXEC SQL ifdef _name ;_ #

    • 如果 name 已通过 EXEC SQL define _name_ 定义,则检查 name 并处理后续行。

  • EXEC SQL ifndef _name ;_ #

    • 如果 namenot 通过 EXEC SQL define _name_ 定义,则检查 name 并处理后续行。

  • EXEC SQL elif _name ;_ #

    • EXEC SQL ifdef _name or EXEC SQL ifndef _name directive. Any number of elif 部分之后开始一个可选的可选替代部分,可以出现部分。如果已定义 name and ,则将处理 elif 之后的行,之前还没有处理过同一 ifdef / ifndef …​endif 构造的部分。

  • EXEC SQL else; #

    • EXEC SQL ifdef _name or EXEC SQL ifndef _name directive. Subsequent lines will be processed if no previous section of the same 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;