On this page
35.9. 预处理程序指令
有几个预处理程序指令可用于修改ecpg
预处理程序解析和处理文件的方式。
35 .9.1. 包括文件
要将外部文件包含到嵌入式 SQL 程序中,请使用:
EXEC SQL INCLUDE filename;
EXEC SQL INCLUDE <filename>;
EXEC SQL INCLUDE "filename";
嵌入式 SQL 预处理器将查找名为filename.h
的文件,对其进行预处理,并将其包含在结果 C 输出中。因此,正确处理了包含文件中的嵌入式 SQL 语句。
ecpg
预处理器将按以下 Sequences 在几个目录中搜索文件:
current directory
/usr/local/include
PostgreSQL 包含目录,在构建时定义(例如
/usr/local/pgsql/include
)/usr/include
但是,当使用EXEC SQL INCLUDE "filename"
时,仅搜索当前目录。
在每个目录中,预处理器将首先查找给定的文件名,如果找不到,将在文件名后附加.h
并重试(除非指定的文件名已具有该后缀)。
请注意,EXEC SQL INCLUDE
与不同:
#include <filename.h>
因为此文件将不受 SQL 命令预处理的约束。当然,您可以 continue 使用 C #include
指令来包含其他头文件。
Note
即使EXEC SQL INCLUDE
命令的其余部分遵循正常的 SQL 区分大小写规则,但是 include 文件名也区分大小写。
35 .9.2. 定义和未定义指令
类似于 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;
当然,您可以 continue 在嵌入式 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 预编译器无法看到此声明。
35 .9.3. ifdef,ifndef,else,elif 和 endif 指令
您可以使用以下指令有条件地编译代码节:
EXEC SQL ifdef name;
- 检查*
name
并处理后续行(如果已使用EXEC SQL define name
创建name
*)。
- 检查*
EXEC SQL ifndef name;
- 检查*
name
并处理后续行,如果name
还没有用EXEC SQL define name
创建。
- 检查*
EXEC SQL else;
- 开始处理
EXEC SQL ifdef name
或EXEC SQL ifndef name
引入的节的替代节。
- 开始处理
EXEC SQL elif name;
- 检查*
name
并如果name
*已用EXEC SQL define name
创建,则开始一个备用节。
- 检查*
EXEC SQL endif;
- 结束替代部分。
Example:
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;