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 报告译文问题。英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。