本节解释 ECPG 的内部工作原理。这些信息有时可能有助于用户理解如何使用 ECPG。
ecpg
写入输出的前四行是固定的行。两个是注释,两个是与库接口必要的包含行。然后预处理器读取文件并写入输出。通常,它只是将所有内容回显到输出。
当它看到一个 EXEC SQL
语句时,它会介入并更改它。该命令以 EXEC SQL
开头,以 ;
结尾。中间的所有内容都被视为一个SQL语句,并进行解析以进行变量替换。
当符号以冒号 (:
) 开头时,会发生变量替换。具有该名称的变量会在先前在 EXEC SQL DECLARE
部分中声明的变量中查找。
库中最重要的函数是 ECPGdo
,它负责执行大多数命令。它接受可变数量的参数。这很容易加起来达到 50 个左右的参数,我们希望这在任何平台上都不会成为问题。
参数是
对于作为SQL命令一部分的每个变量,该函数会获取十个参数
类型作为特殊符号。
指向值的指针或指向指针的指针。
如果变量是 char
或 varchar
,则变量的大小。
数组中的元素数(用于数组获取)。
数组中下一个元素的偏移量(用于数组获取)。
指示器变量的类型作为特殊符号。
指向指示器变量的指针。
0
指示器数组中的元素数(用于数组获取)。
指示器数组中下一个元素的偏移量(用于数组获取)。
请注意,并非所有的 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"
(此处的缩进是为了提高可读性,而不是预处理器所做的。)
如果您在文档中看到任何不正确、与您特定功能的体验不符或需要进一步澄清的内容,请使用此表单来报告文档问题。