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;