选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.0 已于 2015 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

33.12. 预处理器指令 #

33.12.1. 包括文件

要在嵌入式 SQL 程序中包含外部文件,可使用:

EXEC SQL INCLUDE filename;

嵌入式 SQL 预处理器会查找名为filename.h的文件,对它进行预处理,并将其包含在生成的 C 输出中。这样,被包含文件中的嵌入式 SQL 语句就能得到正确处理。

注意这同于:

#include <filename.h>

因为这样包含的文件不会经过 SQL 命令预处理。当然,仍可使用 C 的#include指令包含其他头文件。

注意

被包含文件的名称区分大小写,尽管EXEC SQL INCLUDE命令的其他部分遵循通常的 SQL 大小写规则。

33.12.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的任何名称或标识符。注意你不能把#define用于一个将要在一个嵌入式 SQL 查询中使用的常量,因为在这种情况下嵌入式 SQL 预处理器不能看到这个声明。

33.12.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 nameEXEC 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;

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。