19.8. 错误和消息

利用 RAISE 语句报告信息以及抛出错误.

RAISE level 'format' [, variable [...]];

可能的级别有DEBUG(向服务器日志写信息), LOG(向服务器日志写信息,优先级更高), INFONOTICEWARNING(把信息写到 服务器日志以及转发到客户端应用,优先级逐步升高)和 EXCEPTION(抛出一个错误, 退出当前事务). 某个优先级别的错误信息是报告给客户端还是写到服务器日志, 还是两个都做是由 LOG_MIN_MESSAGESCLIENT_MIN_MESSAGES 配置变量控制的。 参阅PostgreSQL 管理员手册获取更多细节。

在格式字串里,% 被下一个可选参数的外部表现形式代替. 要发出一个文本的 %,你要写 %%. 请注意可选的参数必须是简单的变量,不能是表达式,而且格式必须是一个 简单的字串文本.

例子∶

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

在这个例子里,v_job_id 将被字串中的%代替.

RAISE EXCEPTION ''Inexistent ID --> %'',user_id;

这样会带着给出的错误信息退出事务.

19.8.1. 例外

PostgreSQL 现在还没有足够聪明的 例外处理模型.不管是分析器,规划器/优化器还是执行器认为 一条语句无法再处理下去了,那么整个事务都退出,然后系统跳回 主循环等待来自客户端应用的下一条查询.

我们可以'钩'在错误处理机制上来提示这种情况的发生. 但是目前我们没有能力告诉(用户)是什么导致了退出(输入/输出转换错误, 浮点数错误,分析错误).并且此时的数据库后端可能处在一种不连贯的状态, 所以退回到上层执行器或执行更多的命令可能摧毁整个数据库.

因此,PL/pgSQL 在函数或触发器操作时遇到退出的唯一一项操作是写一些 额外的NOTICE级别的日志信息, 报告在哪个函数和在那里(行号和语句类型)出了错. 这些错误总是中止该函数的执行.