PostgreSQL7.0手册-接口-52. ecpg - 在 C 里嵌入 SQL
第五十二章. 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
内容
为什么要嵌入 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

