Postgresql 中文操作指南

36.17. Internals #

本节解释了 ECPG 的内部工作原理。此信息偶尔可帮助用户了解如何使用 ECPG。

ecpg 写入输出的前四行是固定行。两行是注释,两行是与库连接的必要 include 行。然后,预处理器通读文件并写入输出。通常,它将所有内容回显至输出。

当它看到 EXEC SQL 语句时,它会进行干预并更改它。命令以 EXEC SQL 开始,以 ; 结束。介于这两者之间的一切内容都将被视为 SQL 语句并解析以进行变量替换。

当符号以冒号 (:) 开头时,便会进行变量替换。将在之前在 EXEC SQL DECLARE 节中声明的变量中查找具有该名称的变量。

库中最重要的功能是 ECPGdo,它负责执行大多数命令。它获取可变数量的参数。这可以轻松地累加至 50 个参数,并且我们希望这在任何平台上都不会成为问题。

参数为:

  • A line number #

    • 这是原始行的行号;仅在错误消息中使用。

  • A string #

    • 这是将要发出的 SQL 命令。它由输入变量(即编译时未知的变量,但将在命令中输入)修改。变量应该包含 ?

  • Input variables #

    • 每个输入变量都会导致创建十个参数。(请参见下文。)

  • ECPGt_EOIT #

    • enum 表示没有更多输入变量。

  • Output variables #

    • 每个输出变量都会导致创建十个参数。(请参见下文。)这些变量将由该函数填充。

  • ECPGt_EORT #

    • enum 表示没有更多变量。

对于 SQL 命令的一部分的每个变量,该函数都会获取十个参数:

请注意,并非所有 SQL 命令都以这种方式处理。例如,以下打开游标语句:

EXEC SQL OPEN cursor;

不会复制到输出。相反,游标的 DECLARE 命令用于 OPEN 命令的位置,因为它确实打开了游标。

以下是一个完整示例,描述了文件 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"

(此处的缩进是为了可读性而添加的,而不是预处理器执行的操作。)