PostgreSQL 9.4.4 中文手册 | |||
---|---|---|---|
上一页 | 上一级 | 章 33. ECPG - 在C中嵌入SQL | 下一页 |
可用的几种预处理器指令, 它修改ecpg预处理器分析方式以及处理文件方式。
为了包含一个外部文件到你的嵌入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 指令。
注意: 包含文件名大小写敏感,即使其余的EXEC SQL INCLUDE 命令遵循正常的SQL大小写敏感规则。
类似于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预编译器不能看到这个声明。
你可以使用下面指令有条件地编译代码段:
如果name已经和EXEC SQL define name被创建,那么检查name并处理 随后行。
如果name和EXEC SQL define name 没有被创建, 那么检查name并处理 随后行。
开始处理另一部分到 EXEC SQL ifdef name或者 EXEC SQL ifndef name介绍的部分。
如果name和EXEC SQL define name已经被创建, 那么检查name并且开始另一部分。
结束另一部分。
例子:
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;