多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 40.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_`选项声明了错误的严重性等级。 可能的级别有`DEBUG`,`LOG`, `INFO`, `NOTICE`, `WARNING`, 和`EXCEPTION`,默认的是`EXCEPTION`。 `EXCEPTION`会抛出一个错误(强制关闭当前事务), 而其他级别仅仅是产生不同的优先级信息。 无论是将优先级别的信息是报告给客户端,还是写到服务器日志,亦或是二者都是, 都是由[log_min_messages](#calibre_link-1449)和[client_min_messages](#calibre_link-1448)配置变量控制的。 参阅[Chapter 18](#calibre_link-500)获取更多细节。 如果真有的话,在`_level_`之后, 你可以写`_format_`, (这必须是一个简单的字符串文本,而不是表达式)。 格式字符串声明要报告的错误信息文本。 格式字符串可以遵循插入到信息中的可选参数表达式。 在格式字符串里,`%`被下一个可选参数的外部表现形式代替。 要表示`%`字符必须发出(`%%`)。 在这个例子里,`v_job_id`的值将代替字符串中的`%`: ``` RAISE NOTICE 'Calling cs_create_job(%)', v_job_id; ``` 你可以通过在`_option_` = `_expression_`项后边写`USING`来附加额外信息到错误报告中。 每一个`_expression_`可以是任何字符串值表达式。 允许的`_option_`关键字是: `MESSAGE` 设置错误消息文本。这个选项不能用于包含`USING`之前的格式字符串 的`RAISE`形式中。 `DETAIL` 提供一个错误详细信息。 `HINT` 提供提示信息。 `ERRCODE` 指定错误代码(SQLSTATE)用来报告,通过条件名, 如[Appendix A](#calibre_link-120),或直接作为 五个字符的SQLSTATE代码。 `COLUMN``CONSTRAINT` `DATATYPE` `TABLE` `SCHEMA` 提供一个相关对象名称。 该例子会强制退出事务,并返回如下提示: ``` 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_` USING, 然后将其他的所有东西都放在`USING`列中。 最后一个`RAISE`变形中没有任何参数。 这种形式只能在`BEGIN`块的`EXCEPTION`字句中使用。 它的作用是将正在处理的错误放到下一个封闭的块中。 > **Note:** 在PostgreSQL 9.1之前, 没有参数的`RAISE`被解释为 包含有活跃异常处理程序的块中重新抛出错误。 因此,`EXCEPTION`子句嵌套在该处理器中无法抓取它,即使 `RAISE`在嵌套的`EXCEPTION`子句块中。 这被认为是令人惊讶并且不兼容Oracle的PL/SQL。 如果`RAISE EXCEPTION`中没有声明SQLSTATE的情形名称, 那么缺省使用`RAISE_EXCEPTION` (`P0001`)。 如果没有声明信息文本,那么缺省将情形名称或SQLSTATE作为信息文本。 > **Note:** 当通过SQLSTATE编码声明一个错误代码时,你不能限制预定义错误代码, 但是可以选择任何由五个数字和/或者大写ASCII字母组成的错误代码, 而不是`00000`。建议避免抛出以三个零结尾的错误代码,因为 这些是类别码并且只能通过捕获整个类别来获取。