# 36.16.内部构件

本节解释了ECPG如何在内部工作。这些信息有时有助于用户理解如何使用ECPG。

作者写的前四行ecpg输出端有固定线路。两个是注释,两个是连接到库所需的include行。然后,预处理器读取文件并写入输出。通常情况下,它只是将所有内容与输出相呼应。

当它看到执行SQL声明,它介入并改变了它。命令以执行SQL;。中间的所有内容都被视为SQL语句,并被解析为变量替换。

当符号以冒号开头时,会发生变量替换(:)。具有该名称的变量将在之前在EXEC SQL声明部分

图书馆最重要的功能是ECPGdo,它负责执行大多数命令。它需要可变数量的参数。这可以很容易地加起来50个左右的论点,我们希望这在任何平台上都不会成为问题。

理由如下:

行号

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

一串

这是要发出的SQL命令。它由输入变量修改,即编译时未知但要在命令中输入的变量。变量应该放在哪里字符串包含?.

输入变量

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

ECPGt_EOIT

枚举告诉我们没有更多的输入变量。

输出变量

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

ECPGt_EORT

枚举告诉我们没有更多的变量。

对于SQL命令中的每个变量,函数都会获得十个参数:

  1. 字体是一种特殊的符号。

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

  3. 变量的大小(如果它是烧焦瓦尔查尔.

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

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

  6. 作为特殊符号的指示器变量的类型。

  7. 指向指示符变量的指针。

  8. 0

  9. 指示符数组中的元素数(用于数组回迁)。

  10. 到指示符数组中下一个元素的偏移量(用于数组回迁)。

    请注意,并非所有SQL命令都以这种方式处理。例如,open cursor语句,如:

EXEC SQL OPEN cursor;

不会复制到输出中。相反,光标是声明命令用于打开命令,因为它确实打开了光标。

下面是一个完整的示例,描述了文件预处理器的输出福。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"

(此处添加的缩进是为了可读性,而不是预处理器所做的。)