共计 2111 个字符,预计需要花费 6 分钟才能阅读完成。
1. 异常错误处理
在 PL/pgSQL 函数中,如果没有异常捕获,函数会在发生错误时直接退出,与其相关的事物也会随之回滚。我们可以通过使用带有 EXCEPTION 子句的 BEGIN 块来捕获异常并使其从中恢复。见如下声明形式
[ <> ]
[ DECLARE
declarations ]
BEGIN
statements
EXCEPTION
WHEN condition [ OR condition ... ] THEN
handler_statements
WHEN condition [ OR condition ... ] THEN
handler_statements
END;
如果没有错误发生,只有 BEGIN 块中的 statements 会被正常执行,然而一旦这些语句中有任意一条发生错误,其后的语句都将被跳过,直接跳转到 EXCEPTION 块的开始处。此时系统将搜索异常条件列表,寻找匹配该异常的第一个条件,如果找到匹配,则执行相应的 handler_statements,之后再执行 END 的下一条语句。如果没有找到匹配,该错误就会被继续向外抛出,其结果与没有 EXCEPTION 子 句完全等同。如果此时 handler_statements 中的语句发生新错误,它将不能被该 EXCEPTION 子句捕获,而是继续向外传播,交由其外层 的 EXCEPTION 子句捕获并处理。
在 PostgreSQL 中可以利用 RAISE 语句报告信息和抛出错误,其声明形式为:
RAISE level 'format' [, expression [, ...]];
这里包含的级别有 DEBUG(向服务器日志写信息)、LOG(向服务器日志写信息,优先级更高)、INFO、NOTICE 和 WARNING(把信息写到服务器日志以及转发到客户端应用,优先级逐步升高)和 EXCEPTION 抛出一个错误 (通常退出当前事务)。某个优先级别的信息是报告给客户端还是写到服务器日志,还是两个均有,是由 log_min_messages 和 client_min_messages 这两个系统初始化参数控制的。
在 format 部分中,% 表示为占位符,其实际值仅在 RAISE 命令执行时由后面的变量替换,如果要在 format 中表示 % 自身,可以使用 %% 的形式表示,见如下示例:
RAISE NOTICE ‘Calling cs_create_job(%)’,v_job_id;–v_job_id 变量的值将替换 format 中的 %。
RAISE EXCEPTION ‘Inexistent ID –> %’,user_id;
简单来说:
--抛出异常
RAISE EXCEPTION '你出问题了。该修修!';
--使用 SQLERRM 来显示错误信息。
RAISE EXCEPTION '(%)', SQLERRM;
见如下示例:
CREATE OR REPLACE FUNCTION GETEXCEPTION(v_phone text) RETURNS void AS
$$
BEGIN
IF v_phone = 'iphone' THEN
RAISE EXCEPTION '你出问题了。该修修!';
ELSIF v_phone = 'samsung' THEN
RAISE EXCEPTION '你会爆炸,离你远点!';
else
RETURN;
END IF;
EXCEPTION
WHEN others THEN
RAISE EXCEPTION '(%)', SQLERRM;
END
$$ LANGUAGE PLPGSQL;
参考文献:http://www.postgres.cn/docs/9.3/plpgsql-errors-and-messages.html
Ubuntu 16.04 下安装 PostgreSQL 和 phpPgAdmin http://www.linuxidc.com/Linux/2016-08/134260.htm
Linux 下 RPM 包方式安装 PostgreSQL http://www.linuxidc.com/Linux/2016-03/128906.htm
Linux 下安装 PostgreSQL http://www.linuxidc.com/Linux/2016-12/138765.htm
Linux 下 PostgreSQL 安装部署指南 http://www.linuxidc.com/Linux/2016-11/137603.htm
Linux 下安装 PostgreSQL 并设置基本参数 http://www.linuxidc.com/Linux/2016-11/137324.htm
Ubuntu 16.04 下 PostgreSQL 主从复制配置 http://www.linuxidc.com/Linux/2017-08/146190.htm
Fedota 24 将数据库升级到 PostgreSQL 9.5 http://www.linuxidc.com/Linux/2016-11/137374.htm
CentOS 6.5 下 PostgreSQL 服务部署 http://www.linuxidc.com/Linux/2017-01/139144.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-09/146897.htm