存储过程 触发器 异常处理
有两种类型的异常,一种为内部异常,一种为用户自定义异常,内部异常是执行期间返回到PL/SQL块的ORACLE错误或由PL/SQL代码的某操作引起的错误,如除数为零或内存溢出的情况。用户自定义异常由开发者显示定义,在PL/SQL块中传递信息以控制对于应用的错误处理。
1. 内部异常
最终异常处理
在最后进行异常处理或者捕获,例如下面例子,并不是普通的打印出异常错误,而是调用一个异常日志存储过程==prc_log(SYSDATE, ‘error’);==。将出现的异常记录到异常处理日志中。当出现问题,方便查看异常,找出解决方法。
这一块可以写多个when ,但是最后一个必须是others;例如:
EXCEPTION
WHEN too_many_rows
null; --不处理,跳过
WHEN ...
WHEN ...
.
.
WHEN others THEN
--其他异常,将异常写入异常日志
prc_log(SYSDATE, 'error');
在子程序进行异常处理
除了最后进行异常处理,还可以在SQL代码块中间执行异常处理,处理完,还可继续下面操作。例如下面的BEGIN—END之间子程序的no_data_found异常处理。
这也是一种解决方案。如果是可以预见的异常,则通过这种方式进行处理,出现可预见异常后,执行异常中的语句,然后继续执行下面的操作。如果没有出现异常则不进入该异常,正常执行。
create or replace trigger TR_CUSTOMER_CONTACT_INFO
after update on tbl_contact_info_new
for each row
/*
func:当tbl_contact_info表的数据更新时触发此触发器,
其完成的功能是将tbl_contact_info表部分字段
和v_user_info_2012A的部分字段
插入tbl_user_contact表中。
author:zhaojy
date:2016-11-08
*/
declare
-- 客户Id
o_SUBSID varchar2(40);
o_CUSTID varchar2(40);
REMARK varchar(255);
begin
if :new.direction = 1 then
--呼入数据
BEGIN
select SUBSID, CUSTID
into o_SUBSID, o_CUSTID
from --获取客户id ,用户id
(select SUBSID, CUSTID
from v_user_info_2012a t
where service_num = :new.caller
and nvl(code_type, 0) <> '3'
order by code_type)
where rownum < 2;
REMARK := null;
EXCEPTION
WHEN no_data_found THEN
o_SUBSID := null;
o_CUSTID := null;
REMARK := '在用户表查不到呼入用户';
END;
insert into tbl_user_contact --将数据插入新表中
(contact_id,
·
·
·
·
remark)
values
(:new.contact_id, --接触记录id
·
·
·
·
REMARK);
end if;
EXCEPTION
WHEN others THEN
prc_log(SYSDATE, 'error');
end TR_CUSTOMER_CONTACT_INFO;
2.用户自定义异常
用户自定义异常,在子程序中进行异常处理
对于用户自定义异常,只能在PL/SQL块中的声明部分声明异常,异常的名字由EXCEPTION关键字引入:
reserved_loaned Exception
产生异常后,控制传给了子程序的异常部分,将异常转向各自异常控制块,必须在代码中使用如下的结构处理错误:
Exception
When exception1 then
Sequence of statements;
When exception2 then
Sequence of statements;
When others then
3.异常的抛出
有三种方式抛出异常
1. 通过PL/SQL运行时引擎
2. 使用RAISE语句
3. 调用RAISE_APPLICATION_ERROR存储过程
当数据库或PL/SQL在运行时发生错误时,一个异常被PL/SQL运行时引擎自动抛出。异常也可以通过RAISE语句抛出
RAISE exception_name;