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

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

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3
历史版本PostgreSQL 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

4.6. 错误处理 #

嵌入式 SQL 接口提供了处理程序中异常条件的 一种简单方法和一种复杂方法。第一种 方法在某个条件发生时自动打印 一条消息。例如:

EXEC SQL WHENEVER sqlerror sqlprint;

or

EXEC SQL WHENEVER not found sqlprint;

这种错误处理在整个程序期间保持启用。

注意

这不是 EXEC SQL WHENEVER 语句 用法的详尽例子。更多用法示例可以在 SQL 手册中找到(例如 Groff 和 Weinberg 的 The LAN TIMES Guide to SQL)。

为了更强大的错误处理,嵌入式 SQL 接口 提供了一个 struct 和一个名为 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 将为 0 (ECPG_NO_ERROR)。如果 sqlca.sqlcode 小于零,这是严重的错误,例如数据库 定义与查询不匹配。如果大于零,则是 普通错误,例如表中没有所请求的行。

sqlca.sqlerrm.sqlerrmc 将包含一个 描述错误的字符串。该字符串以源文件中的 行号结尾。

可能发生的错误有:

-12, Out of memory in line %d.

通常不应出现。这表示你的虚拟内存 已耗尽。

-200 (ECPG_UNSUPPORTED): Unsupported type %s on line %d.

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

-201 (ECPG_TOO_MANY_ARGUMENTS): Too many arguments line %d.

这表示服务器返回的参数比我们 拥有的匹配变量多。也许你在 INTO :var1,:var2 列表中漏掉了几个 宿主变量。

-202 (ECPG_TOO_FEW_ARGUMENTS): Too few arguments line %d.

这表示服务器返回的参数比我们 拥有的宿主变量少。也许你在 INTO :var1,:var2 列表中放了太多宿主变量。

-203 (ECPG_TOO_MANY_MATCHES): Too many matches line %d.

这表示查询返回了多行,但指定 的变量不是数组。SELECT 命令不唯一。

-204 (ECPG_INT_FORMAT): Not correctly formatted int type: %s line %d.

这表示宿主变量的类型是 int,而 PostgreSQL 数据库中的 字段是另一种类型,包含不能被解释为 int 的值。库用 strtol() 做这个转换。

-205 (ECPG_UINT_FORMAT): Not correctly formatted unsigned type: %s line %d.

这表示宿主变量的类型是 unsigned int,而 PostgreSQL 数据库中的 字段是另一种类型,包含不能被解释为 unsigned int 的值。库用 strtoul() 做这个转换。

-206 (ECPG_FLOAT_FORMAT): Not correctly formatted floating-point type: %s line %d.

这表示宿主变量的类型是 float,而 PostgreSQL 数据库中的 字段是另一种类型,包含不能被解释为 float 的值。库用 strtod() 做这个转换。

-207 (ECPG_CONVERT_BOOL): Unable to convert %s to bool on line %d.

这表示宿主变量的类型是 bool,而 PostgreSQL 数据库中的 字段既不是 't' 也不是 'f'。

-208 (ECPG_EMPTY): Empty query line %d.

查询为空。(这在嵌入式 SQL 程序中通常 不应发生,因此可能指向一个内部错误。)

-209 (ECPG_MISSING_INDICATOR): NULL value without indicator in line %d.

返回了空值但没有提供空指示符 变量。

-210 (ECPG_NO_ARRAY): Variable is not an array in line %d.

在需要数组的 地方使用了普通变量。

-211 (ECPG_DATA_NOT_ARRAY): Data read from backend is not an array in line %d.

数据库在需要数组值的 地方返回了普通变量。

-220 (ECPG_NO_CONN): No such connection %s in line %d.

程序试图访问一个不存在的连接。

-221 (ECPG_NOT_CONN): Not connected in line %d.

程序试图访问一个确实存在但 未打开的连接。

-230 (ECPG_INVALID_STMT): Invalid statement name %s in line %d.

你试图使用的语句还没有被准备。

-240 (ECPG_UNKNOWN_DESCRIPTOR): Descriptor %s not found in line %d.

找不到指定的描述符。你 试图使用的语句还没有被准备。

-241 (ECPG_INVALID_DESCRIPTOR_INDEX): Descriptor index out of range in line %d.

指定的描述符索引超出范围。

-242 (ECPG_UNKNOWN_DESCRIPTOR_ITEM): Descriptor %s not found in line %d.

找不到指定的描述符。你试图使用的语句还没有被准备。

-243 (ECPG_VAR_NOT_NUMERIC): Variable is not a numeric type in line %d.

数据库返回了数值而变量不是 数值型。

-244 (ECPG_VAR_NOT_CHAR): Variable is not a character type in line %d.

数据库返回了非数值而变量是 数值型。

-400 (ECPG_PGSQL): Postgres error: %s line %d.

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

-401 (ECPG_TRANS): Error in transaction processing line %d.

PostgreSQL 表示我们无法 开始、提交或回滚事务。

-402 (ECPG_CONNECT): Could not connect to database %s in line %d.

连接数据库失败。

100 (ECPG_NOT_FOUND): Data not found line %d.

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

提交更正

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