# 36.9.预处理器指令

36.9.1. 包括文件

36.9.2. define和undef指令

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;