pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
这一节解释ECPG在内部如何工作。这些信息有时有助于用户理解如何使用ECPG。
ecpg写入输出的前四行是固定的:其中两行是注释,另外两行是与库接口所必需的包含行。随后预处理器会通读整个文件并写出输出,通常它只是把所有内容原样回显到输出中。
当它看到EXEC SQL语句时,就会介入并对其进行改写。命令以EXEC SQL开始,以;结束。其间的所有内容都会被视为一条SQL语句,并进行变量替换解析。
当某个符号以冒号(:)开头时,就会发生变量替换。系统会在此前于EXEC SQL DECLARE声明节中声明的变量里查找同名变量。
库中最重要的函数是ECPGdo,负责执行大多数命令。它接收可变数量的参数,参数数量很容易达到 50 个左右;我们希望这在任何平台上都不会造成问题。
参数是:
这是原始行的行号,只用于错误消息。
这是将要发出的SQL命令。输入变量会对它进行修改,也就是那些在编译时尚未知晓、但要填入命令中的变量。字符串中的?表示变量应当放置的位置。
每个输入变量都会生成十个参数(见下文)。
ECPGt_EOIT一个表明后面没有更多输入变量的enum值。
每个输出变量都会生成十个参数(见下文)。这些变量将由该函数填充。
ECPGt_EORT一个表明后面没有更多变量的enum值。
对于每一个作为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>;
/* 声明节开始 */
#line 1 "foo.pgc"
int index;
int result;
/* 声明节结束 */
...
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"
(这里的缩进是为了可读性而添加的,并非是预处理器做的处理)。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。