有几个预处理器指令可用于修改 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
指令来包含其他头文件。
include 文件名区分大小写,即使 EXEC SQL INCLUDE
命令的其余部分遵循正常的 SQL 大小写敏感性规则。
类似于 C 中已知的 #define
指令,嵌入式 SQL 也有类似的概念
EXEC SQL DEFINEname
; EXEC SQL DEFINEname
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 DEFINE
和 EXEC SQL UNDEF
的效果不会跨文件传递:每个文件都只使用命令行上 -D
开关定义的符号开始。
您可以使用以下指令有条件地编译代码段
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
或 name
EXEC SQL ifndef
指令之后开始一个可选的替代部分。可以出现任意数量的 name
elif
部分。如果 name
已被定义并且同一 ifdef
/ifndef
...endif
结构的前一部分未被处理,则将处理 elif
后面的行。
EXEC SQL else;
#在 EXEC SQL ifdef
或 name
EXEC 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;
如果您发现文档中有任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。