当前位置:早雪网网络学院编程文档数据库技术Postgresql → PostgreSQL7.0手册-接口-52. ecpg - 在 C 里嵌入 SQL

PostgreSQL7.0手册-接口-52. ecpg - 在 C 里嵌入 SQL

减小字体 增大字体 作者:不详  来源:supcode.com收集整理  发布时间:2005-7-23 12:22:03
第五十二章. ecpg - 在 C 里嵌入 SQL
内容 
为什么要嵌入 SQL? 
概念 
如何使用 ecpg 
局限 
从其他 RDBMS 移植 
安装 
寄语开发者 
这里描写 Postgres 里在 C 软件包里嵌入 SQL.这部分是由 Linus Tolke (译注:是不是叫 Linus 的都是计算机天才?)和 Michael Meskes 写的. 
注意:你可以象 PostgreSQL 其他部分那样拷贝和使用这些内容.
为什么要嵌入 SQL?
嵌入使用 SQL 比其他操作 SQL 查询的方法有一些小小的优势.它关心所有你的C 程序里面变量信息的往返.许多 RDBMS 软件包支持这种嵌入的语言. 
有一个 ANSI 的标准描述嵌入的语言应该怎样工作.ecpg 被设计成尽可能地符合这个标准.因此这就有可能把为其他 RDBMS 软件包书写的嵌入式 SQL 程序移植到 Postgres 上来并因此而推动自由软件的精神的发展.

--------------------------------------------------------------------------------

概念
你在你的 C 程序里面用一些特殊的 SQL 东西来编写程序.对于定义可以在 SQL 语句里面使用的变量,你需要把它们放到一个特殊的定义段里面.你用一些特殊的语法来表达 SQL 查询. 
在编译之前,你用嵌入的 SQLC 预编译器对你的文件进行预处理,由这个预编译器把你使用的 SQL 语句转换成把变量作为参数的函数调用.不管是作为输入到 SQL 语句里面的变量还是将包含返回结果的变量都被传到函数调用里. 

然后你编译你的程序,在链接时,你的程序会与一个包含所用函数的特殊的库链接.这些函数(实际上大多是一个单一的函数)从参数里取得信息,用通常的方法(libpq)执行 SQL 查询并且把结果放回到声明为输出的参数里. 

这样你运行你的程序时当控制到达 SQL 语句时,SQL 语句对数据库进行操作因而你可以对结果进行继续处理.


--------------------------------------------------------------------------------  
--------------------------------------------------------------------------------

如何使用 ecpg
本节讨论如何使用 ecpg 工具. 
预编译器
预编译器叫 ecpg.在安装过后它存放在 Postgres bin/ 目录下面.

ecpg 库叫做 libecpg.a 或 libecpg.so.另外,该库用了 libpq 库与 Postgres 服务器通讯,所以你要将你的程序与这两个库链接: -lecpg -lpq. 
库里面有一些方法是"隐藏"的,但是有时候这些方法可能提供非常有用的信息. 

ECPGdebug(int on, FILE *stream) 如果第一个参数不为零则打开调试信息.调试信息记录在 stream. 大多数 SQL 语句把它的参数和结果记录日志. 
最重要的一个 (ECPGdo)(函数)记录它的所有展开的字符串,也就是说,带有插入的所有变量的字符串和从Postgres 服务器来的结果.这个对搜索你的 SQL 语句的错误是非常有用的. 

ECPGstatus() 这个方法/函数在我们与一个数据库联接后返回 TRUE 并且如果没有联接返回 FALSE .

错误控制
要想检测从 Postgres 服务器来得错误,你要包含如下一行 
      exec sql include sqlca;
到你的文件的包含段里.这样做将会定义一个结构和一个象下面一样名为 sqlca 的变量: 
struct sqlca
{
 char sqlcaid[8];
 long sqlabc;
 long sqlcode;
 struct
 {
  int sqlerrml;
  char sqlerrmc[70];
 } sqlerrm;
 char sqlerrp[8];
 long sqlerrd[6];
 /* 0: empty                                         */
 /* 1: OID of processed tuple if applicable          */
 /* 2: number of rows processed in an INSERT, UPDATE */
 /*    or DELETE statement                           */
 /* 3: empty                                         */
 /* 4: empty                                         */
 /* 5: empty                                         */
 char sqlwarn[8];
 /* 0: set to 'W' if at least one other is 'W'       */
 /* 1: if 'W' at least one character string          */
 /*    value was truncated when it was               */
 /*    stored into a host variable.                  */
 /* 2: empty                                         */
 /* 3: empty                                         */
 /* 4: empty                                         */
 /* 5: empty                                         */
 /* 6: empty                                         */
 /* 7: empty                                         */
 char sqlext[8];
} sqlca;
如果最后一个SQL 语句发生了错误,那么 sqlca.sqlcode 将是非零值.如果 sqlca.sqlcode 小于 0 那么就是发生了某种严重的错误,象数据库定义与查询定义不一致等.如果大于 0 则是通常的错误,象表不包括所要求的行等. 
sqlca.sqlerrm.sqlerrmc 将包含一个字符串描述该错误.该字符串以源文件的行号结尾。 

可能发生的错误列表: 
  
-12, Out of memory in line %d. 
通常不出现这个错误。这是你的虚拟内存耗尽的标志。 
-200, Unsupported type %s on line %d. 
通常不出现这个错误.这表明预编译器生成了一些库(函数)不认得的东西.可能你运行的预编译器和当前库不兼容. 
-201, Too many arguments line %d. 
这意味着 Postg

[1] [2] [3]  下一页

[数据载入中...] [返回上一页] [打 印]