On this page
36.16. Internals
本节说明 ECPG 如何在内部工作。该信息有时可能对帮助用户了解如何使用 ECPG 很有用。
ecpg写入输出的前四行是固定行。两个是 Comments,两个是包含与库连接所必需的行。然后,预处理器读取文件并写入输出。通常,它只是将所有内容回显到输出。
当看到EXEC SQL语句时,它会干预并更改它。该命令以EXEC SQL开头,以;结束。介于两者之间的所有内容均视为 SQL 语句,并对其进行分析以进行变量替换。
当符号以冒号(:)开头时,将发生变量替换。在先前在EXEC SQL DECLARE部分中声明的变量中查找具有该名称的变量。
库中最重要的功能是ECPGdo,它负责执行大多数命令。它需要可变数量的参数。最多可以轻松添加 50 个左右的参数,我们希望这在任何平台上都不会成为问题。
参数为:
- 行号 - 这是原始行的行号;仅在错误消息中使用。
 
- A string - 这是要发出的 SQL 命令。它由 Importing 变量修改,即在编译时未知但要在命令中 Importing 的变量。变量应放在何处,字符串包含?。
 
- 这是要发出的 SQL 命令。它由 Importing 变量修改,即在编译时未知但要在命令中 Importing 的变量。变量应放在何处,字符串包含
- Input variables - 每个 Importing 变量都会导致创建十个参数。 (见下文.)
 
- ECPGt_EOIT- enum告诉您没有其他 Importing 变量。
 
- Output variables - 每个输出变量都会导致创建十个参数。 (请参见下文.)这些变量由函数填充。
 
- ECPGt_EORT- enum告诉您没有更多变量。
 
对于属于 SQL 命令的每个变量,该函数将获取十个参数:
- 作为特殊符号的类型。 
- 指向值的指针或指向该指针的指针。 
- 变量的大小(如果是 - char或- varchar)。
- 数组中元素的数量(用于数组提取)。 
- 数组中下一个元素的偏移量(用于数组提取)。 
- Metrics 变量的类型,作为特殊符号。 
- 指向 Metrics 变量的指针。 
- 0 
- Metrics 数组中的元素数(用于数组提取)。 
- Metrics 数组中下一个元素的偏移量(用于数组提取)。 
请注意,并非所有 SQL 命令都以这种方式处理。例如,打开的游标语句如下:
EXEC SQL OPEN cursor;
没有复制到输出。相反,在OPEN命令的位置使用了光标的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"
(此处的缩进是为了提高可读性而添加的,而不是预处理器要执行的操作.)