↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 6.5 / 6.3
历史版本PostgreSQL 6.3 已于 2003 年 3 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页。

44.3. 如何使用 egpc

本节介绍如何使用 egpc 工具。

44.3.1. 预处理器

预处理器叫做 ecpg。 安装后它位于 Postgres 的 bin/ 目录中。

44.3.2. 库

ecpg 库叫做 libecpg.a 或 libecpg.so。此外,该库 用 libpq 库与 Postgres 服务器通信,因此你必须用 -lecpg -lpq 链接你的程序。

库中有一些"隐藏的"方法,但它们有时可能 非常有用。

ECPGdebug(int, FILE *stream)

如果以第一个参数非零调用它,就会打开调试 日志。调试日志输出到 stream。大多数 SQL 语句会记录其 参数和结果。

最重要的一个(ECPGdo)在除 EXEC SQL COMMIT、EXEC SQL ROLLBACK、 EXEC SQL CONNECT 之外的所有 SQL 语句上都会被调用,它同时记录展开后的字符串、即插入了所有 输入变量的字符串,以及 Postgres 服务器的 结果。在查找 SQL 语句中的 错误时这非常有用。

ECPGstatus()

这个方法在已连接到数据库时返回 TRUE,否则返回 FALSE。

44.3.3. 错误处理

为了能够检测来自 Postgres 服务器的错误,你需要在 文件的 include 节中加入类似下面的一行:

exec sql include sqlca;

这会定义一个结构和名为 sqlca 的变量,如下所示:

struct sqlca {
    int sqlcode;
    struct {
        int sqlerrml;
        char sqlerrmc[1000];
    } sqlerrm;
} sqlca;

如果最后一条 SQL 语句发生了错误,sqlca.sqlcode 将非零。如果 sqlca.sqlcode 小于 0,则是 某种严重错误,比如数据库定义与给定的查询 不匹配。如果大于 0,则是普通错误,比如 表中不包含所请求的行。

sqlca.sqlerrm.sqlerrmc 将包含一个描述错误的字符串。 该字符串以 “line 23.” 结尾,其中行号是 源文件中的行号(实际上是预处理器生成的文件中的行号,但 我希望将来能把它修正为输入文件中的行号。)

可能发生的错误列表:

-1, Unsupported type %s on line %d.

通常不应出现。这表明预处理器生成了 库不认识的内容。也许你 运行的预处理器和库的版本不兼容。

-1, Too many arguments line %d.

预处理器出错了,生成了不正确的代码。

-1, Too few arguments line %d.

预处理器出错了,生成了不正确的代码。

-1, Error starting transaction line %d.

Postgres signalled to us that we cannot open the connection.

-1, Postgres error: %s line %d.

某种 Postgres 错误。消息中包含来自 Postgres 后端的错误消息。

1, Data not found line %d.

这是一个"正常"错误,告诉你所查询的内容找不到, 或者游标已经取到了末尾。

-1, To many matches line %d.

这表示查询返回了多行。你执行的 SELECT 可能不是唯一的。

-1, Not correctly formatted int type: %s line %d.

这表示宿主变量的类型是 int,而 Postgres 数据库中的字段是另一种类型,其值 无法解释为 int。库使用 strtol 做这一转换。

-1, Not correctly formatted unsigned type: %s line %d.

这表示宿主变量的类型是 unsigned int,而 Postgres 数据库中的字段是另一种类型,其值 无法解释为 unsigned int。库使用 strtoul 做这一转换。

-1, Not correctly formatted floating point type: %s line %d.

这表示宿主变量的类型是 float,而 Postgres 数据库中的字段是另一种类型,其值 无法解释为 float。库使用 strtod 做这一转换。

-1, Too few arguments line %d.

这表示 Postgres 返回的记录多于我们匹配的 变量。也许你在 INTO :var1,:var2 列表中漏掉了几个宿主变量。

-1, Too many arguments line %d.

这表示 Postgres 返回的记录少于我们的 宿主变量数。也许你的 INTO :var1,:var2 列表中宿主变量太多了。

-1, Empty query line %d.

Postgres 返回了 PGRES_EMPTY_QUERY。

-1, Error: %s line %d.

这表示 Postgres 返回了 PGRES_NONFATAL_ERROR、PGRES_FATAL_ERROR 或 PGRES_BAD_RESPONSE 错误之一。是哪一个以及为什么在消息中有说明。

-1, Postgres error line %d.

Postgres 返回了库不知道如何处理的内容。 这很可能是因为 Postgres 的版本与 ecpg 库的版本不匹配。

-1, Error committing line %d.

COMMIT 期间出错。EXEC SQL COMMIT 被转换为 Postgres 中的 end 操作,而该操作 无法执行。

-1, Error rolling back line %d.

ROLLBACK 期间出错。EXEC SQL ROLLBACK 被转换为 Postgres 中的 abort 操作,而该操作 无法执行。

-1, ECPGconnect: could not open database %s.

连接数据库失败。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。