返回介绍

I. 教程

II. SQL 语言

III. 服务器管理

IV. 客户端接口

V. 服务器端编程

VI. 参考手册

VII. 内部

VIII. 附录

30.13. 内部

发布于 2019-09-30 03:08:26 字数 2709 浏览 1094 评论 0 收藏 0

这一节解释 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 命令,因为它同样也打开游标。

    下面是一个完整的例子,描述了文件 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;

    is translated into:

    /* 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"

    (这里的对齐是我们为了增强可读性加的,可不是预处理器能干的事情。)

    <
    PrevHomeNext
    库函数Up信息模式

    如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

    扫码二维码加入Web技术交流群

    发布评论

    需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
    列表为空,暂无数据
      我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
      原文