提供了一些预处理器指令,用于修改 ecpg 预处理器解析和处理文件的方式。
要将外部文件包含到您的嵌入式 SQL 程序中,请使用
EXEC SQL INCLUDEfilename; EXEC SQL INCLUDE <filename>; EXEC SQL INCLUDE "filename";
嵌入式 SQL 预处理器将查找一个名为 的文件,对其进行预处理,并将其包含在生成的 C 输出中。因此,包含文件中的嵌入式 SQL 语句将被正确处理。filename.h
该 ecpg 预处理器将按以下顺序在多个目录中搜索文件:
/usr/local/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 大小写敏感规则。
与 C 语言中的 #define 指令类似,嵌入式 SQL 也有一个类似的概念:
EXEC SQL DEFINEname; EXEC SQL DEFINEnamevalue;
所以您可以定义一个名称
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 DEFINE 和 EXEC SQL UNDEF 的效果不会跨文件传递:每个文件都只包含命令行上 -D 开关定义的符号。
您可以使用以下指令有条件地编译代码段:
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 指令后开始一个可选的替代部分。可以出现任意数量的 nameelif 部分。如果 name 已定义 并且 同一 ifdef/ifndef...endif 结构中的前一个部分未被处理,则处理 elif 后续的行。
EXEC SQL else; #在 EXEC SQL ifdef 或 nameEXEC SQL ifndef 指令后开始一个可选的最终替代部分。如果同一 nameifdef/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;