↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本。 PostgreSQL 7.3 已结束支持。 请参阅 当前版本手册.

4.11. 给开发者 #

本节解释 ecpg 的内部工作原理。这些信息偶尔能帮助用户理解如何使用 ecpg。

4.11.1. The Preprocessor

ecpg写入输出的前四行是固定的:其中两行是注释,另外两行是与库接口所必需的包含行。随后预处理器会通读整个文件并写出输出,通常它只是把所有内容原样回显到输出中。

当它看到 EXEC SQL 语句时,会介入并改写它。命令以 exec sql 开始,以 ; 结束。中间的一切都被当作 SQL 语句并解析变量替换。

当符号以冒号(:)开头时发生变量替换。具有该名称的变量会在先前在 EXEC SQL DECLARE 区中声明的变量里查找。根据该变量用于输入还是输出,会输出一个指向该变量的指针供函数访问。

对于作为 SQL 查询一部分的每个变量,函数还会得到其他参数:

  • 用特殊符号表示的类型。

  • 一个值的指针或者一个指针的指针。

  • 如果变量是一个char或者varchar,这是它的尺寸。

  • 数组中元素的数量(用于数组获取)。

  • 数组中下一个元素的偏移量(用于数组获取)。

  • 作为一个特殊符号的指示符变量的类型。

  • 指向指示符变量值的指针,或指向指示符变量指针的指针。

  • 0

  • 指示符数组中的元素个数(用于数组抓取)。

  • 到指示符数组中下一个元素的偏移量(用于数组取数)。

注意并非所有 SQL 命令都这样处理。例如,像

EXEC SQL OPEN cursor;

这样的 open cursor 语句不会复制到输出中。相反,会使用游标的 DECLARE 命令,因为它也会打开游标。

下面是一个完整的例子,描述预处理器对文件 foo.pgc 的输出(细节可能随预处理器的各个具体版本而变化):

EXEC SQL BEGIN DECLARE SECTION;
int index;
int result;
EXEC SQL END DECLARE SECTION;
...
EXEC SQL SELECT res INTO :result FROM mytable WHERE index = :index;

被翻译成:

/* Processed by ecpg (2.6.0) */
/* These two include files are added by the preprocessor */
#include <ecpgtype.h>;
#include <ecpglib.h>;

/* exec sql begin declare section */

#line 1 "foo.pgc"

 int index;
 int result;
/* exec sql end declare section */
...
ECPGdo(__LINE__, NULL, "SELECT res FROM mytable WHERE index = ?     ",
        ECPGt_int,&(index),1L,1L,sizeof(int),
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
        ECPGt_int,&(result),1L,1L,sizeof(int),
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 147 "foo.pgc"

(本手册中的缩进是为了可读性而加的,并不是预处理器所做的。)

4.11.2. 库

库中最重要的函数是 ECPGdo。它接受数量可变的参数。但愿没有计算机会限制 varargs() 函数可接受的变量数。这很容易累积到 50 个左右的参数。

参数有:

一个行号

这是原语句的行号;只用于错误消息。

一个字符串

这是要发出的 SQL 查询。它被输入变量修改,即那些编译时未知但要输入查询的变量。在变量应出现的位置,字符串中包含 ?。

输入变量

如关于预处理器的一节所述,每个输入变量得到十个参数。

ECPGt_EOIT

一个表明后面没有更多输入变量的enum值。

输出变量

如关于预处理器的一节所述,每个输入变量得到十个参数。这些变量由该函数填充。

ECPGt_EORT

一个表明后面没有更多变量的enum值。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.