使用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配置变量控制。详见Chapter 19。
在第一种语法变体中,在level之后(如果有),写一个format字符串 (必须是一个简单的字符串文字,而不是一个表达式)。格式字符串指定要报告的错误消息文本。 格式字符串后跟要插入到消息中的可选参数表达式。 在格式字符串中,%将被下一个可选参数的值的字符串表示替换。写 %%以发出一个字面上的%。 参数的数量必须与格式字符串中的%占位符的数量匹配,否则在函数编译期间会引发错误。
在这个示例中,v_job_id的值将替换字符串中的%:
RAISE NOTICE 'Calling cs_create_job(%)', v_job_id;
在第二和第三种语法变体中,condition_name 和 sqlstate 分别指定错误条件名称或五字符 SQLSTATE 代码。 有效的错误条件名称和预定义 SQLSTATE 代码见 Appendix A。
下面是 condition_name 和 sqlstate 的用法示例:
RAISE division_by_zero; RAISE WARNING SQLSTATE '22012';
在任意一种语法变体中,都可以通过写一个后面跟着option = expression项的USING,为错误报告附加额外信息。每一个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被解释为重新抛出来自包含活动异常处理器的块的错误。因此一个嵌套在那个处理器中的EXCEPTION子句无法捕捉它,即使RAISE位于嵌套EXCEPTION子句的块中也是这样。这种行为很奇怪,也并不兼容 Oracle 的 PL/SQL。
如果在RAISE EXCEPTION命令中没有指定条件名称或SQLSTATE, 则默认使用raise_exception (P0001)。 如果没有指定消息文本,则默认使用条件名称或SQLSTATE作为消息文本。
当用 SQLSTATE 代码指定错误代码时,你并不受限于预定义错误代码,而是可以选择任何由五位数字和/或大写 ASCII 字母构成的错误代码,唯一不能使用的是 00000。我们建议尽量避免抛出以三个零结尾的错误代码,因为这些是类别代码,只能用于捕获整个类别。
ASSERT语句是一种向 PL/pgSQL函数中插入调试检查的方便方法。
ASSERTcondition[ ,message];
condition是一个布尔 表达式,它被期望总是计算为真。如果确实如此, ASSERT语句不会再做什么。但如果结果是假 或者空,那么将发生一个ASSERT_FAILURE异常(如果在计算 condition时发生错误, 它会被报告为一个普通错误)。
如果提供了可选的message, 它是一个结果(如果非空)被用来替换默认错误消息文本 “assertion failed”的表达式(如果 condition失败)。 message表达式在 断言成功的普通情况下不会被计算。
通过配置参数plpgsql.check_asserts可以启用或者禁用断言测试, 这个参数接受布尔值且默认为on。如果这个参数为off, 则ASSERT语句什么也不做。
注意ASSERT是为了检测程序的 bug,而不是 报告普通的错误情况。如果要报告普通错误,请使用前面介绍的 RAISE语句。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。