ORACLE的异常处理

存储过程 触发器 异常处理

有两种类型的异常,一种为内部异常,一种为用户自定义异常,内部异常是执行期间返回到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
  date2016-11-08
*/
declare
  -- 客户Id
  o_SUBSID varchar2(40);
  -- 用户id
  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
      --空数据异常(在v_user_info_2012a查不到对应数据)给o_SUBSID,o_CUSTID赋空值
      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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值