PostgreSQL存储过程(5)-异常错误处理

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

时间: 2024-10-05 21:23:48

PostgreSQL存储过程(5)-异常错误处理的相关文章

Oracle存储过程中异常Exception的捕捉和处理

Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Varchar2) AUTHID CURRENT_USER AS --声明异常 some_kinds_of_err EXCEPTION; -- Exception to indicate an error condition v_ErrorCode NUMBER; -- Variable to hold

总结:整理 oracle异常错误处理 . (转载)

5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 5.2 异常错误传播 5.2.1 在执行部分引发异常错误 5.2.2 在声明部分引发异常错误 5.3 异常错误处理编程 5.4 在 PL/SQL 中使用 SQLCODE, SQLERRM异常处理函数 即使是写得最好的PL/SQL程序也会遇到错误或未预料到的事件.一个优秀的程序都应该能够正确处理各种出错情况,并尽可能从错误中恢复.任何ORACLE错误

【转】oracle异常错误处理

5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4  用户定义的异常处理 5.2 异常错误传播 5.2.1 在执行部分引发异常错误 5.2.2 在声明部分引发异常错误 5.3 异常错误处理编程 5.4  在 PL/SQL 中使用 SQLCODE, SQLERRM异常处理函数 即使是写得最好的PL/SQL程序也会遇到错误或未预料到的事件.一个优秀的程序都应该能够正确处理各种出错情况,并尽可能从错误中恢复.任何ORACLE

调用PostgreSQL存储过程,找不到函数名的问题

PostgreSQL的表,函数名称都是严格区分大小写的,所以在使用的时候没有注意大小写问题容易导致找不到函数名的错误,但最近两天我们发现,如果函数参数使用了自定义的数据类型,也会发生这个问题. 问题描述: 下面的示例测试代码: PWMIS.DataProvider.Data.AdoHelper db = MyDB.GetDBHelperByConnectionName("PostgreSQL");            IDataParameter para = db.GetParam

存储过程中异常如何处理

一.存储过程使用 try......catch异常处理 1.TRY 块以 BEGIN TRY 语句开头,以 END TRY 语句结尾.在 BEGIN TRY 和 END TRY 语句之间可以指定一个或多个 Transact-SQL 语句. 2.CATCH 块必须紧跟 TRY 块. 3.CATCH 块以 BEGIN CATCH 语句开头,以 END CATCH 语句结尾. 4.在 Transact-SQL 中,每个 TRY 块仅与一个 CATCH 块相关联. 二.存储过程异常处理实例 ----简单

Mybatis调用PostgreSQL存储过程实现数组入参传递

注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递  > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于PostgreSQL自带数组类型,所以有一个自定义函数的入参就是一个int数组,形如: CREATE OR REPLACE FUNCTION "public"."func_arr_update"(ids _int4)... 1 如上所示,参数是一个int数组,Mybatis提

[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) 得到了大家的强力支持与建议,万分感谢.接下来介绍下一篇:oracle pl/sql异常处理部分,还望大家一定

异常错误处理

第五章 异常错误处理 1 异常处理 异常处理是用来处理正常执行过程中未预料的事件,程序块的异常处理预定义的错误和自定义错误,由于PL/SQL程序块一旦产生异常而没有指出如何处理时 程序就会自动终止整个程序运行 有三种类型的异常错误 1 预定义错误 ORACLE预定义的异常情况大约有24个,对这种异常情况的处理,无需再程序中定义,有oracle 自动将其引发 2 非预定义错误 即其他标准的ORACLE错误,对这种异常情况的处理, 需要用户在程序中定义,然后由ORACLE自动将其引发 3用户定义错误

【转】[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

[推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) 得到了大家的强力支持与建议,万分感谢.接下来介绍下一篇:oracle pl/sql异常处理部分,还望大家一定要支持与推荐呀~! 本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义的异常