预处理器指令

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 33. ECPG - 在C中嵌入SQL | 下一页

# 33.9. 预处理器指令

可用的几种预处理器指令， 它修改`ecpg`预处理器分析方式以及处理文件方式。

## 33.9.1. 包含文件

为了包含一个外部文件到你的嵌入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大小写敏感规则。

## 33.9.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`。 注意你不能为打算用在嵌入SQL查询中的常数使用`#define`， 因为在这种情况下嵌入的SQL预编译器不能看到这个声明。

## 33.9.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 `name``或者 `EXEC 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;

上一页 | 起始页 | 下一页
错误处理 | 上一级 | 处理嵌入的SQL程序