选择 打开 改范围 完整检索页

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
历史版本PostgreSQL 9.0 已于 2015 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

39.8. 错误和消息 #

使用 RAISE 语句报告消息并抛出错误。

RAISE [ level ] 'format' [, expression [, ... ]] [ USING option = expression [, ... ] ];
RAISE [ level ] condition_name [ USING option = expression [, ... ] ];
RAISE [ level ] SQLSTATE 'sqlstate' [ USING option = expression [, ... ] ];
RAISE [ level ] USING option = expression [, ... ];
RAISE ;

level 选项指定错误 严重性。允许的级别有 DEBUGLOGINFONOTICEWARNINGEXCEPTION,默认为 EXCEPTIONEXCEPTION 抛出一个错误(这通常会中止当前 事务);其他级别只生成不同优先级的消息。某个特定优先级的消息 是报告给客户端、写入服务器日志,还是两者都做,由 log_min_messagesclient_min_messages 配置变量控制。 更多信息见 第 18 章

level(如果有) 之后,可以写一个 format (必须是简单的字符串字面量,不能是表达式)。格式字符串指定要 报告的错误消息文本。格式字符串之后可以跟上可选的参数表达式, 其值将被插入消息中。在格式字符串内, % 会被替换为下一个可选参数值的字符串表示。 写成 %% 可以输出一个字面的 %

在这个例子中,v_job_id 的值将替换字符串中的 %

RAISE NOTICE 'Calling cs_create_job(%)', v_job_id;

可以通过写出 USING,后面跟上 option = expression 项目,为错误报告附加 额外信息。允许的 option 关键字是 MESSAGEDETAILHINTERRCODE,每个 expression 都可以是任意字符串值 表达式。MESSAGE 设置错误消息文本(该选项不能 用于在 USING 之前包含格式字符串的 RAISE 形式)。 DETAIL 提供错误的详细信息, HINT 提供一个提示消息。 ERRCODE 指定要报告的错误代码(SQLSTATE), 可以用 附录 A 中所示的条件名,或者 直接作为一个五字符 SQLSTATE 代码。

这个例子会中止事务,并给出指定的错误消息和提示:

RAISE EXCEPTION 'Nonexistent ID --> %', user_id
      USING HINT = 'Please check your user id';

这两个示例展示了设置 SQLSTATE 的两种等价的方法:

RAISE 'Duplicate user ID: %', user_id USING ERRCODE = 'unique_violation';
RAISE 'Duplicate user ID: %', user_id USING ERRCODE = '23505';

RAISE 还有第二种语法,其中主参数是要报告的 条件名或 SQLSTATE,例如:

RAISE division_by_zero;
RAISE SQLSTATE '22012';

在这种语法中,USING 可用于提供自定义的错误 消息、详细信息或提示。前面示例的另一种写法是

RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;

还有一种变体是写 RAISE USINGRAISE level USING, 把其余所有内容都放进 USING 列表。

RAISE 的最后一种变体完全不带参数。这种形式 只能用在 BEGIN 块的 EXCEPTION 子句内部;它会把当前正在处理的错误 重新抛给下一个外围块。

如果 RAISE EXCEPTION 命令中既没有指定条件名 也没有指定 SQLSTATE,默认使用 RAISE_EXCEPTIONP0001)。 如果没有指定消息文本,默认使用条件名或 SQLSTATE 作为消息 文本。

注意

通过 SQLSTATE 代码指定错误代码时,并不限于预定义的错误代码, 而是可以选择由五位数字和/或大写 ASCII 字母组成的任何错误代码, 但 00000 除外。建议避免抛出以三个零结尾的 错误代码,因为它们是类别代码,只能通过捕获整个类别来捕获。

提交更正

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