postgresql中怎么抛出异常
2023-04-18 14:24:27 时间
在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语句报告信息和抛出错误,其声明形式为:
这里包含的级别有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;
更多技术请关注Python视频教程。
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击