45.3. How To Use ecpg
本节介绍如何使用 ecpg 工具。
45.3.1. Preprocessor
预处理器叫做 ecpg。安装后它位于
Postgres 的 bin/ 目录中。
45.3.2. Library
ecpg 库叫做
libecpg.a 或
libecpg.so。此外,该库用 libpq 库与
Postgres 服务器通信,因此你必须用
-lecpg -lpq 链接你的程序。
库中有一些"隐藏的"方法,但它们有时可能非常有用。
ECPGdebug(int在第一个参数非零时打开调试日志。调试日志输出到on, FILE *stream)stream。大多数 SQL 语句会记录其参数和结果。最重要的一个(
ECPGdo)几乎在所有 SQL 语句上都会被调用,它同时记录展开后的字符串、即插入了所有输入变量的字符串,以及 Postgres 服务器的结果。在查找 SQL 语句中的错误时这非常有用。ECPGstatus()这个方法在已连接到数据库时返回 TRUE,否则返回 FALSE。
45.3.3. 错误处理
为了能够检测来自 Postgres 服务器的错误,你可以在文件的 include 区中包含像下面这样的一行:
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: empty */
/* 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.
这表示 Postgres 返回的参数比我们拥有的匹配变量多。也许你在
INTO :var1,:var2列表中漏掉了几个宿主变量。- -202, Too few arguments line %d.
这表示 Postgres 返回的参数比我们拥有的宿主变量少。也许你在
INTO :var1,:var2列表中放了太多宿主变量。- -203, Too many matches line %d.
这表示查询返回了多行但指定的变量不是数组。你执行的
SELECT很可能不唯一。- -204, Not correctly formatted int type: %s line %d.
这表示宿主变量的类型是
int,而 Postgres 数据库中的字段是另一种类型,包含不能被解释为int的值。库用strtol做这个转换。- -205, Not correctly formatted unsigned type: %s line %d.
这表示宿主变量的类型是
unsigned int,而 Postgres 数据库中的字段是另一种类型,包含不能被解释为unsigned int的值。库用strtoul做这个转换。- -206, Not correctly formatted floating point type: %s line %d.
这表示宿主变量的类型是
float,而 Postgres 数据库中的字段是另一种类型,包含不能被解释为float的值。库用strtod做这个转换。- -207, Unable to convert %s to bool on line %d.
这表示宿主变量的类型是
bool,而 Postgres 数据库中的字段既不是 't' 也不是 'f'。- -208, Empty query line %d.
Postgres 返回了 PGRES_EMPTY_QUERY,很可能因为查询确实是空的。
- -220, No such connection %s in line %d.
程序试图访问一个不存在的连接。
- -221, Not connected in line %d.
程序试图访问一个确实存在但未打开的连接。
- -230, Invalid statement name %s in line %d.
你试图使用的语句还没有被准备。
- -400, Postgres error: %s line %d.
某种 Postgres 错误。消息中包含来自 Postgres 后端的错误消息。
- -401, Error in transaction processing line %d.
Postgres 向我们表示无法开始、提交或回滚事务。
- -402, connect: could not open database %s.
连接数据库失败。
- 100, Data not found line %d.
这是一个"正常"错误,告诉你所查询的内容找不到,或者我们已经遍历完了游标。