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;