博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL存储过程(5)-异常错误处理
阅读量:5905 次
发布时间:2019-06-19

本文共 1633 字,大约阅读时间需要 5 分钟。

1. 异常错误处理

  在PL/pgSQL函数中,如果没有异常捕获,函数会在发生错误时直接退出,与其相关的事物也会随之回滚。我们可以通过使用带有EXCEPTION子句的BEGIN块来捕获异常并使其从中恢复。见如下声明形式:

[ <> ][ DECLARE    declarations ]BEGIN    statementsEXCEPTION  WHEN condition [ OR condition ... ] THEN            handler_statements  WHEN condition [ OR condition ... ] THEN         handler_statementsEND;

如果没有错误发生,只有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

转载地址:http://ttcpx.baihongyu.com/

你可能感兴趣的文章
Spring Cloud Config采用数据库存储配置内容【Edgware+】
查看>>
[周榜单]极乐小程序榜单(第十三期)
查看>>
[JAVA多线程相关资料]
查看>>
单点登录实现思路
查看>>
POJ p1979 递归
查看>>
opencv计算时间
查看>>
性能瓶颈的分类
查看>>
maven scope system
查看>>
#综合实践#通过puppet管理远程docker容器——配置puppet和实现变更
查看>>
PLSQL连Oracle数据库Could not load "……\bin\oci.dll"
查看>>
centos6.4安装GitLab
查看>>
Spring(Test)
查看>>
Ruby on Rails vs. PHP vs. Python
查看>>
Android图片剪切
查看>>
如何将 rhevm 加入 AD 域
查看>>
使用putty远程连接linux防止关闭putty程序就停止
查看>>
GCC基本概念及实践(2)
查看>>
Hacker技术是怎么样学习的
查看>>
Linux Vim编辑器的使用技巧
查看>>
oracle 两表关联时,年月条件的写法引起的巨大性能的差异
查看>>