阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

PostgreSQL存储过程之异常错误处理

164次阅读
没有评论

共计 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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2111字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中