自治事务,是独立于普通事务的一致性外,可以单独开辟的一个事务。即本事务提交或回滚,都不影响自治事务的提交和回滚。
这里举一例说明,自治事务记录报错信息的好处。
报错往往会中断,导致事务回滚,原来的报错触发条件便不可查询,我做了一个存储过程,在其他存储过程或触发器的exception里面调用这个段存储过程,便会将错误信息插入一张错误日志表。
存储过程如下:
- create or replace procedure test.P_CHECK_ERRLOG(v_prog in varchar2 default '未声明程序名称',
- v_oraerr in varchar2 default '未声明ORA报错信息',
- v_keyname in varchar2 default '未声明关键字段',
- v_keyval in varchar2 default '未声明自关键值',
- v_cus in varchar2 default '未声明自定义信息',
- v_errlvl in varchar2 default 'WARNING',
- v_memo in varchar2 default '未声明备注') is
- PRAGMA AUTONOMOUS_TRANSACTION;
- begin
- insert into test.check_errlog
- (programname, oraerr, keyname, keyvalue, customermes, Errlvl, memo)
- values
- (v_prog, v_oraerr, v_keyname, v_keyval, v_cus, v_errlvl, v_memo);
- commit;
- end P_CHECK_ERRLOG;
调用过程如下
- --trg部分省略
- begin
- INSERT INTO test.temp
- (col_a,col_b)
- VALUES
- (:new.col_a,:new.col_b);
- exception
- when DUP_VAL_ON_INDEX then
- begin
- test.p_check_errlog(v_prog => 'TRG_TEST',
- v_oraerr => sqlerrm,
- v_keyname => 'col_a',
- v_keyval => :NEW.col_a,
- v_memo => '目标表重复,本表正常插入,line77');
- end;
- when others then
- begin
- test.p_check_errlog(v_prog => 'TRG_TEST',
- v_oraerr => sqlerrm,
- v_keyname => 'col_a',
- v_keyval => :NEW.col_a,
- v_cus => 'col_b:' || :new.col_b,
- v_memo => '异常插入,line85');
- end;
- raise_application_error(-20002, '插入异常,请检查错误日志表');
- end;
第一种情况,是忽略唯一性错误,自治事务会记录该信息。
第二种情况是记录错误信息,并声明报错,中断操作。
注意,如果是不同用户,需要显示赋权,
- grant execute on test.p_check_errlog to usera;
- grant insert on test.check_errlog to usera;
才可以在触发器或存储过程里调用
转载于:https://blog.51cto.com/gundam/1149228