plsql自治事务在异常中的使用

本文介绍了在Oracle PL/SQL中如何使用自治事务(AUTONOMOUS_TRANSACTION)来确保在异常发生时正确记录错误日志。通过创建一个存储过程`record_error`,在主事务中捕获并记录错误信息,即使主事务回滚,错误日志也会被提交。自治事务的特点是其独立于主事务,可以在事务中进行提交或回滚而不影响主事务的执行状态。
摘要由CSDN通过智能技术生成

将记录日志单独存放成一个普通的存储过程

CREATE OR REPLACE PROCEDURE record_error
IS
  
   l_code   PLS_INTEGER := SQLCODE;
   l_mesg  VARCHAR2(32767) := SQLERRM;
BEGIN
   INSERT INTO error_log (error_code
                        ,  error_message
                        ,  backtrace
                        ,  callstack
                        ,  created_on
                        ,  created_by)
        VALUES (l_code
              ,  l_mesg
              ,  sys.DBMS_UTILITY.format_error_backtrace
              ,  sys.DBMS_UTILITY.format_call_stack
              ,  SYSDATE
              ,  USER);
              
 end;

在别的存储过程的异常处理中使用

 DECLARE
  i_number   NUMBER (1);
BEGIN
  i_number:=100;
  insert into student values(4,'d',99);
  insert into student values(5,'e',100);
EXCEPTION
  WHEN OTHERS
  THEN
    record_error();
    raise;
END;

i_number:=100这个会跑错误出来,但是在执行后,error_log中没有记录,异常回滚掉了,需要将这个存储过程标记成自制事务,

CREATE OR REPLACE PROCEDURE record_error
IS
   PRAGMA AUTONOMOUS_TRANSACTION;
   l_code   PLS_INTEGER := SQLCODE;
   l_mesg  VARCHAR2(32767) := SQLERRM;
BEGIN
   INSERT INTO error_log (error_code
                        ,  error_message
                        ,  backtrace
                        ,  callstack
                        ,  created_on
                        ,  created_by)
        VALUES (l_code
              ,  l_mesg
              ,  sys.DBMS_UTILITY.format_error_backtrace
              ,  sys.DBMS_UTILITY.format_call_stack
              ,  SYSDATE
              ,  USER);
              commit;
 end;

这样在抛出异常的时候就能捕获异常了,下面的解释来自:http://blog.sina.com.cn/s/blog_66cd71d90100shw7.html

ORACLE8i的AUTONOMOUS TRANSACTION(自治事务,以下AT)是一个很好的回答。
  AT 是由主事务(以下MT)调用但是独立于它的事务。在AT被调用执行时,MT被挂起,在AT内部,一系列的DML可以被执行并且commit或rollback.
  注意由于AT的独立性,它的commit和rollback并不影响MT的执行效果。在AT执行结束后,主事务获得控制权,又可以继续执行了。

自治事务在错误日志记录中的使用可以参考编程艺术这本书


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值