# 36.9.预处理器指令
36.9.3. ifdef、ifndef、elif、else和endif指令
可以使用几个预处理器指令来修改ecpg
预处理器解析并处理文件。
# 36.9.1.包括文件
要在嵌入式SQL程序中包含外部文件,请使用:
EXEC SQL INCLUDE filename;
EXEC SQL INCLUDE <filename>;
EXEC SQL INCLUDE "filename";
嵌入式SQL预处理器将查找名为*
文件名*h
,对其进行预处理,并将其包含在生成的C输出中。因此,可以正确处理包含文件中的嵌入式SQL语句。
这个ecpg
预处理器将按以下顺序在多个目录中搜索文件:
当前目录
/usr/本地/包括
PostgreSQL包含目录,在构建时定义(例如。,
/usr/local/pgsql/include
)/usr/包括
但是什么时候
EXEC SQL INCLUDE“*
文件名*"
则只搜索当前目录。在每个目录中,预处理器将首先查找给定的文件名,如果找不到,将追加
H
添加到文件名,然后重试(除非指定的文件名已具有该后缀)。注意
EXEC SQL包括
是不一样:
#include <filename.h>
因为该文件不受SQL命令预处理的约束。当然,您可以继续使用C#包括
指令以包含其他头文件。
# 笔记
include文件名区分大小写,尽管EXEC SQL包括
命令遵循正常的SQL区分大小写规则。
# 36.9.2.define和undef指令
与指令类似#定义
从C语言中可以看出,嵌入式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';
使用未定义
要删除以前的定义,请执行以下操作:
EXEC SQL UNDEF MYNUMBER;
当然,您可以继续使用C版本#定义
和#未定义
在嵌入式SQL程序中。不同之处在于对定义的值进行评估的地方。如果你使用EXEC SQL定义
然后ecpg
预处理器评估定义并替换值。例如,如果你写:
EXEC SQL DEFINE MYNUMBER 12;
...
EXEC SQL UPDATE Tbl SET col = MYNUMBER;
然后ecpg
将已经进行替换,并且您的C编译器将永远不会看到任何名称或标识符我的号码
.请注意,您不能使用#定义
对于将在嵌入式SQL查询中使用的常量,因为在这种情况下,嵌入式SQL预编译器无法看到此声明。
# 36.9.3.ifdef、ifndef、elif、else和endif指令
可以使用以下指令有条件地编译代码段:
execsqlifdef*
名称*;
检查*名称
如果需要,则处理后续行名称
*已通过定义EXEC SQL定义*
名称*
.
EXEC SQL ifndef*
名称*;
检查*名称
如果需要,则处理后续行名称
有不*已通过定义EXEC SQL定义*
名称*
.
execsqlelif*
名称*;
在execsqlifdef*
名称*
或EXEC SQL ifndef*
名称*
指令。任何数量的否则如果
部分可以出现。在一个否则如果
将被处理,如果*名称
已经定义了和*之前没有相同的章节条件编译
/如果未定义
...恩迪夫
构造已被处理。
EXEC SQL else;
开始一个可选的、最终的可选部分execsqlifdef*
名称*
或EXEC SQL ifndef*
名称*
指令。如果没有相同的前一部分,将处理后续行条件编译
/如果未定义
...恩迪夫
构造已被处理。
EXEC SQL endif;
结束条件编译
/如果未定义
...恩迪夫
建筑后续行正常处理。
条件编译
/如果未定义
...恩迪夫
构造可以嵌套,最深可达127层。
本例将编译三个示例中的一个设定时区
命令:
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;