pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
本节介绍如何使用 ecpg 工具。
预处理器叫做 ecpg。 安装后它位于 Postgres 的 bin/ 目录中。
ecpg 库叫做 libecpg.a 或 libecpg.so。此外,该库 用 libpq 库与 Postgres 服务器通信,因此你必须用 -lecpg -lpq 链接你的程序。
库中有一些"隐藏的"方法,但它们有时可能 非常有用。
ECPGdebug(int 在第一个参数非零时 打开调试日志。 调试日志输出到 on, FILE *stream)stream。 大多数 SQL 语句会记录其参数和结果。
最重要的一个(ECPGdo) 几乎在所有 SQL 语句上都会被调用,它 同时记录展开后的字符串、 即插入了所有输入变量的 字符串,以及 Postgres 服务器的结果。 在查找 SQL 语句中的 错误时这非常有用。
ECPGstatus() 这个方法在已连接到数据库时返回 TRUE,否则返回 FALSE。
为了能够检测来自 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: 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 将包含一个 描述错误的字符串。该字符串以源文件中的 行号结尾。
可能发生的错误列表:
通常不发生。这表示你的虚拟内存 已经耗尽。
通常不发生。这表示预处理器 生成了库不认识的内容。也许 你运行的预处理器和库的版本不兼容。
这表示 Postgres 返回的参数 比我们拥有的 匹配变量多。也许你在 INTO :var1,:var2 列表中漏掉了几个宿主变量。
这表示 Postgres 返回的参数 比我们拥有的 宿主变量少。也许你在 INTO :var1,:var2 列表中放了太多宿主变量。
这表示查询返回了多行但 指定的变量不是数组。你执行的 SELECT 很可能不唯一。
这表示宿主变量的类型是 int,而 Postgres 数据库中的 字段是另一种类型,包含不能被解释为 int 的值。库用 strtol 做这个转换。
这表示宿主变量的类型是 unsigned int,而 Postgres 数据库中的 字段是另一种类型,包含 不能被解释为 unsigned int 的值。库 用 strtoul 做这个转换。
这表示宿主变量的类型是 float,而 Postgres 数据库中的 字段是另一种类型,包含 不能被解释为 float 的值。库 用 strtod 做这个转换。
这表示宿主变量的类型是 bool,而 Postgres 数据库中的字段既不是 't' 也不是 'f'。
Postgres 返回了 PGRES_EMPTY_QUERY,很 可能因为查询确实是空的。
程序试图访问一个不存在的连接。
程序试图访问一个确实存在但未打开的连接。
你试图使用的语句还没有被准备。
某种 Postgres 错误。 消息中包含来自 Postgres 后端的错误消息。
Postgres 向我们表示无法开始、 提交或回滚事务。
连接数据库失败。
这是一个"正常"错误,告诉你所查询的 内容找不到,或者我们已经遍历完了 游标。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。