使用 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 配置变量控制。更多信息请参见 第 19 章。
在第一种语法变体中,如果 level 存在,后面跟着一个 format 字符串(必须是简单的字符串字面量,而不是表达式)。格式字符串指定要报告的错误消息文本。格式字符串后面可以跟可选的参数表达式,用于插入到消息中。在格式字符串内部,% 被替换为下一个可选参数的值的字符串表示形式。要输出字面量 %,请写 %%。参数的数量必须与格式字符串中的 % 占位符数量匹配,否则会在函数编译期间引发错误。
在此示例中,v_job_id 的值将替换字符串中的 %。
RAISE NOTICE 'Calling cs_create_job(%)', v_job_id;
在第二种和第三种语法变体中,condition_name 和 sqlstate 分别指定一个错误条件名称或一个五字符的 SQLSTATE 代码。请参见 附录 A 了解有效的错误条件名称和预定义的 SQLSTATE 代码。
以下是 condition_name 和 sqlstate 用法的示例:
RAISE division_by_zero; RAISE WARNING SQLSTATE '22012';
在任何这些语法变体中,您都可以通过写入 USING 加上 option = expression 条目来附加额外信息到错误报告。每个 expression 可以是任何字符串值的表达式。允许的 option 关键字是:
此示例将以给定的错误消息和提示中止事务。
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 unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;
如第四种语法变体所示,也可以写 RAISE USING 或 RAISE ,并将其他所有内容放入 level USINGUSING 列表中。
RAISE 的最后一种变体没有任何参数。此形式只能在 BEGIN 块的 EXCEPTION 子句内使用;它会导致当前正在处理的错误被重新引发。
在 PostgreSQL 9.1 之前,不带参数的 RAISE 被解释为重新引发来自包含活动异常处理程序的块的错误。因此,即使 RAISE 在嵌套的 EXCEPTION 子句的块内,嵌套在该处理程序内的 EXCEPTION 子句也无法捕获它。这被认为令人惊讶,并且与 Oracle 的 PL/SQL 不兼容。
如果在 RAISE EXCEPTION 命令中没有指定条件名称或 SQLSTATE,则默认使用 raise_exception(P0001)。如果未指定消息文本,则默认使用条件名称或 SQLSTATE 作为消息文本。
当通过 SQLSTATE 代码指定错误代码时,您不限于预定义的错误代码,但可以选择任何由五个数字和/或大写 ASCII 字母组成的错误代码,除了 00000。建议您避免引发以三个零结尾的错误代码,因为这些是类别代码,只能通过捕获整个类别来捕获。
ASSERT 语句是方便地将调试检查插入 PL/pgSQL 函数的一种快捷方式。
ASSERTcondition[ ,message];
condition 是一个布尔表达式,预期它总是会计算为 true;如果为 true,则 ASSERT 语句不做任何其他操作。如果结果为 false 或 null,则会引发 ASSERT_FAILURE 异常。(如果在评估 condition 时发生错误,它将作为一个正常错误报告。)
如果提供了可选的 message,它是一个表达式,其结果(如果不是 null)将替换默认错误消息文本“assertion failed”,以防 condition 失败。在断言成功(正常情况)时,message 表达式不会被评估。
断言的测试可以通过配置参数 plpgsql.check_asserts 来启用或禁用,该参数接受一个布尔值;默认值为 on。如果此参数为 off,则 ASSERT 语句不执行任何操作。
请注意,ASSERT 用于检测程序错误,而不是报告普通错误条件。对于这种情况,请使用上面描述的 RAISE 语句。