Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

34.17. 内部机制 #

本节介绍 ECPG 的内部工作原理。这些信息有时可帮助用户了解如何使用 ECPG

ecpg 写入输出的四行初始行是固定的行。两行是注释,两行是连接到库所需要的包含行。预处理器然后读取文件并写入输出。正常情况下,它只把所有内容回显到输出。

当它看到 EXEC SQL 语句时,它会进行干预并对其进行更改。该命令以 EXEC SQL 开始,以 ; 结束。中间的所有内容均被视为C 中嵌入语句,并针对变量替换进行解析。

当符号以冒号 (:) 开头时,会发生变量替换。会根据在 EXEC SQL DECLARE 部分内之前声明的变量,查找具有此名称的变量。

库中最重要的函数是 ECPGdo,它负责执行大多数命令。它接受数量可变的参数。这样很容易累加到 50 个左右的参数,我们希望这在任何平台上都不会成为问题。

参数是

行号 #

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

字符串 #

这是C 中嵌入要发布的命令。它由输入变量(即编译时未知但在命令中要输入的变量)修改。变量应进入的内容,字符串包含 ?

输入变量 #

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

ECPGt_EOIT #

enum 表明没有更多输入变量。

输出变量 #

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

ECPGt_EORT #

enum 表明没有更多变量。

对于属于C 中嵌入命令的每个变量,该函数都会获得十个参数

  1. 类型形式是特殊符号。

  2. 到值或到指针的指针。

  3. 如果变量是 charvarchar,变量的大小。

  4. 数组中元素的数量(用于数组提取)。

  5. 到数组中下一个元素的偏移量(用于数组提取)。

  6. 指示器变量的类型形式是特殊符号。

  7. 到指示器变量的指针。

  8. 0

  9. 指示器数组中的元素数(用于数组提取)。

  10. 指示器数组中到下一个元素的偏移量(用于数组提取)。

请注意,并非所有 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"

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