今天正好由于项目上的特殊的需求,要在trigger执行的最后抛出异常,但是又想记录操作日志到数据库表中。google之后,看到可以使用自治事务,解决上述问题。
一、自治事务使用情况
无法回滚的审计 : 一般情况下利用触发器禁止某些对表的更新等操作时,若记录日志,则触发器最后抛出异常时会造成日志回滚。利用自治事务可防止此点。
避免变异表: 即在触发器中操作触发此触发器的表
在触发器中使用ddl 写数据库:对数据库有写操作(insert、update、delete、create、alter、commit)的存储过程或函数是无法简单的用sql来调用的,此时可以将其设为自治事务,从而避免ora-14552(无法在一个查询或dml中执行ddl、commit、rollback)、ora-14551(无法在一个查询中执行dml操作)等错误。需要注意的是函数必须有返回值,但仅有in参数(不能有out或in/out参数)。
开发更模块化的代码: 在大型开发中,自治事务可以将代码更加模块化,失败或成功时不会影响调用者的其它操作,代价是调用者失去了对此模块的控制,并且模块内部无法引用调用者未提交的数据。
二、Oracle 自制事务
Oracle 自制事务是指的存储过程和函数可以自己处理内部事务不受外部事务的影响,用pragma autonomous_transaction来声明,要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQL语句都是自治的。
结束一个自治事务必须提交一个commit、rollback或执行ddl,否则会产生Oracle错误ORA-06519: active autonomous transaction detected and rolled back 。
三、实例
-------------------------------------------------------------------------
-- 存储过程名:P_DTMS_UPDATE_SAP
-- 插入数据到T_DATA_DTMS_TAX_EXPORTTOSAP中
-- 自治事务(pragma autonomous_transaction)
-- 2012-12-28
-------------------------------------------------------------------------
create or replace procedure P_DTMS_UPDATE_SAP(
i_pkvalue in number,
i_opcontent_ori in VARCHAR2,
i_opcontent_dest in VARCHAR2,
i_source in varchar2
)
is
pragma autonomous_transaction;
begin
INSERT INTO T_DATA_DTMS_TAX_EXPORTTOSAP(ID, DTMS_TAX_INVOICE_ID, OPERATE_TYPE, EXPORT_TO_SAP_ORI, EXPORT_TO_SAP_DEST, OPERATE_TIME, SOURCE)
VALUES(SEQ_DATA_DTMS_TAX_EXPORTTOSAP.NEXTVAL,i_pkvalue,'update',i_opcontent_ori,i_opcontent_dest,sysdate, i_source);
commit;
end;
-------------------------------------------------------------------------
-- 触发器名称:TRG_INVOICE_EXPORTTOSAP_MODIFY
-- 当表T_DTMS_TAX_INVOICE做更新操作时触发,用于对EXPORT_TO_SAP标志位做将1改为0时,抛出异常,回滚修改,即:不允许将EXPORT_TO_SAP从1改为0
-- 2012-12-28
-------------------------------------------------------------------------
create or replace trigger "TRG_INVOICE_EXPORTTOSAP_MODIFY"
after update
on T_DTMS_TAX_INVOICE
for each row
declare v_pkvalue NUMBER(20);
v_opcontent_ori VARCHAR2(50);--修改前的值
v_opcontent_dst VARCHAR2(50);--修改后的值
begin
v_pkvalue := :new.id;
case when updating then
v_opcontent_ori := :old.EXPORT_TO_SAP;
v_opcontent_dst := :new.EXPORT_TO_SAP;
if v_opcontent_ori = 1 and v_opcontent_dst = 0 then
P_DTMS_UPDATE_SAP(v_pkvalue,v_opcontent_ori,v_opcontent_dst,'invoice');--自治事务,调用这个过程的时候它就会独立于调用它的父事务进行操作
RAISE_APPLICATION_ERROR(-20100, 'Cannot Modify T_DTMS_TAX_INVOICE.EXPORT_TO_SAP From 1 To 0.');--抛出异常,RAISE_APPLICATION_ERROR(num,msg),num在-20000到-20999之间,msg写你希望抛出的异常。
end if;
end case;
end;
分享到:
相关推荐
Oracle自治事务的介绍(Autonomous_Transactions)PRAGMA_AUTONOMOUS_TRANSACTION
在触发器中使用自制事务及调用存储过程 Declare Pragma Autonomous_Transaction; ...
自治事务是与主事务相分离的,所以它不能检测到被修改过的行的当前状态。这就好像在主事务提交之前,它们一直处于单独的会话里,对自治事务来说,它们是不可用的。然而,反过来情况就不同了:主事务能够检测到已经...
oracle 触发器 调用 存储过程 Oracle自治事务(Autonomous Transaction)
Oracle自治事务处理数据库(Oracle ATP)AES256-CBC与其他数据库之间的互操作性 动机 现代软件系统之间的互操作性对于客户而言尤其重要。 借助我的Always Free Oracle ATP中的Oracle RESTful数据服务(ORDS)技术,...
对子程序的调用者权限、管道表函数、传递触发器标识:new和:old以及自治事务也给出了具体的解决方法。第8 章 LOB与面向对象的数据管理. 第9章 Oracle的监听器和网络设置。包括Oracle网络体系结构,Oracle Net参数文件...
第一部分 ORACLE系统优化基本知识 23 第1章 ORACLE结构回顾 23 §1.1 Oracle数据库结构 23 §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1...
对子程序的调用者权限、管道表函数、传递触发器标识:new和:old以及自治事务也给出了具体的解决方法。第8 章 LOB与面向对象的数据管理. 第9章 Oracle的监听器和网络设置。包括Oracle网络体系结构,Oracle Net参数文件...
CruiseYoung提供的带有详细书签的电子... 14.12 自治事务 409 14.13 小结 413 第15章 测试与质量保证 415 15.1 测试用例 416 15.2 测试方法 417 15.3 单元测试 418 15.4 回归测试 422 15.5 模式修改 422 15.6...
8.6.1 自治事务如何工作? 273 8.6.2 何时使用自治事务? 276 8.7 小结 279 第9章 redo与undo 281 9.1 什么是redo? 281 9.2 什么是undo? 282 9.3 redo和undo如何协作? 285 9.4 提交和回滚处理 289 9.4.1 ...
第 1章 开发成功的Oracle应用程序...................................................... 61 1.1 我的方法................................................................................ 63 3 / 976 1.2 ...
[Q]怎么样设置自治事务 5 [Q]怎么样在过程中暂停指定时间 5 [Q]怎么样快速计算事务的时间与日志量 5 [Q]怎样创建临时表 6 [Q]怎么样在PL/SQL中执行DDL语句 6 [Q]怎么样获取IP地址 7 [Q]怎么样加密存储过程 7 [Q] 7 ...
怎么获得今天是星期几,还关于其它日期函数用法 [Q]随机抽取前N条记录的问题 [Q]抽取从N行到M行的记录,如从20行到30行的记录 [Q]怎么样抽取重复记录 [Q]怎么样设置自治事务 [Q]怎么样在过程中暂停指定时间 [Q]...
9:数据装载 10:优化策略和工具 11:优化器方案稳定性 12:分析函数 13:物化试图 14:分区 15:自治事务 16:动态SQL 17:intermedia 18:基于C的外部过程 19:JAVA存储过程 20:使用对象关系特性 21:精细存取控制...
9:数据装载 10:优化策略和工具 11:优化器方案稳定性 12:分析函数 13:物化试图 14:分区 15:自治事务 16:动态SQL 17:intermedia 18:基于C的外部过程 19:JAVA存储过程 20:使用对象关系特性 21:精细存取控制...
Oracle自治数据库是一个创新的数据平台,包括事务数据,关系数据,nosql和分析数据。 在这段时间内,我们将构建一个包含事务处理应用程序和分析应用程序的集成数据平台。 在此期间,我们将执行的主要主题是: 1....
本文介绍了在记录有关Oracle数据库中的操作的信息时可以使用的技术,例如自治事务和操作信息。
PLSQL个人总结最佳实践。