Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

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预处理器将按照下面顺序在几个目录中 搜索文件:

但是当使用EXEC SQL INCLUDE "filename"时,仅仅搜索当前目录。

在每个目录中,预处理器将首先寻找给定的文件名,如果没有找到将追加 .h到文件名然后再次尝试(除非指定文件名已经有这种后缀)。

注意EXEC SQL INCLUDE一样的:

#include <filename.h>

因为这个文件不受SQL命令预处理的影响。当然,你可以继续使用 包含其他头文件的C #include 指令。

注意: 包含文件名大小写敏感,即使其余的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;

如果nameEXEC SQL define name 没有被创建, 那么检查name并处理 随后行。

EXEC SQL else;

开始处理另一部分到 EXEC SQL ifdef name或者 EXEC SQL ifndef name介绍的部分。

EXEC SQL elif name;

如果nameEXEC 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;