38.8. 错误和消息 #
使用 RAISE 语句报告消息并抛出错误。
RAISE [level] 'format' [,expression[, ... ]] [ USINGoption=expression[, ... ] ]; RAISE [level]condition_name[ USINGoption=expression[, ... ] ]; RAISE [level] SQLSTATE 'sqlstate' [ USINGoption=expression[, ... ] ]; RAISE [level] USINGoption=expression[, ... ]; RAISE ;
level 选项指定错误严重性。允许的级别有
DEBUG、LOG、INFO、NOTICE、WARNING 和
EXCEPTION,默认为
EXCEPTION。EXCEPTION 抛出一个错误(这通常会中止当前事务);其他级别只生成不同优先级的消息。某个特定优先级的消息是报告给客户端、写入服务器日志,还是两者都做,由log_min_messages和client_min_messages配置变量控制。更多信息见第 18 章。
在 level(如果有)之后,可以写一个 format(必须是简单的字符串字面量,不能是表达式)。格式字符串指定要报告的错误消息文本。格式字符串之后可以跟上可选的参数表达式,其值将被插入消息中。在格式字符串内,% 会被替换为下一个可选参数值的字符串表示。写成 %% 可以输出一个字面的
%。
在这个例子中,v_job_id 的值将替换字符串中的
%:
RAISE NOTICE 'Calling cs_create_job(%)', v_job_id;
可以通过写出 USING,后面跟上
option = expression 项目,为错误报告附加额外信息。允许的
option 关键字是
MESSAGE、DETAIL、HINT 和
ERRCODE,每个
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 USING 或
RAISE
,把其余所有内容都放进 level USINGUSING 列表。
RAISE 的最后一种变体完全不带参数。这种形式只能用在 BEGIN 块的
EXCEPTION 子句内部;它会把当前正在处理的错误重新抛给下一个外围块。
如果 RAISE EXCEPTION 命令中既没有指定条件名也没有指定 SQLSTATE,默认使用
RAISE_EXCEPTION(P0001)。如果没有指定消息文本,默认使用条件名或 SQLSTATE 作为消息文本。
注意
通过 SQLSTATE 代码指定错误代码时,并不限于预定义的错误代码,而是可以选择由五位数字和/或大写 ASCII 字母组成的任何错误代码,但 00000 除外。建议避免抛出以三个零结尾的错误代码,因为它们是类别代码,只能通过捕获整个类别来捕获。