触发器传参数给存储过程,存储过程中有insert tableA where id=1....接着update tableA where id=1.
由于insert语句不是自动提交,所以当insert语句没有commit的时候,update会报“表/视图发生了变化,程序不能读它”的错误,也就是id=1这一行被insert锁住了。
此时,在触发器中调用自治事务,问题得以解决。
Oracle自治事务(Autonomous Transaction)将一个主事务分割成几个子事务,在执行完子事务以后再继续主事务。这里的关键是,子事务是独立于主事务的,子事务中的Rollback和Commit操作只会影响子事务中的DML操作;同样,主事务中的Rollback和Commit操作只会影响事务中的DML操作,而不会影响子事务中的操作。在子事务中已经commit的操作,不会被主事务中的rollback撤销。
制定PL/SQL程序块为自治事务可以通过在程序开头使用如下命令实现
PRAGMA AUTONOMOUS_TRANSACTION
定义自治事务必须遵循以下规则:
如果要被定义为自治事务的程序是匿名的,则它必须是一个最外层的程序块。
如果不是匿名的,则它必须是函数或者过程,或者是包含在一个中。在一个包中,只有其中的函数或过程能够定义成自治事务。整个包不能申明为自治事务。
一个对象的方法可以申明为自治事务
触发器可以申明为自治事务
内嵌程序块不能申明为自治事务
注意:对于一个匿名的自治事务程序块来说,只有这个块的begin和end之间的代码被看作是自治事务。
触发器代码如下:
create or replace trigger trigger_main2_update before update on t_busi_main_presend2 for each row declare pragma autonomous_transaction; --声明该触发器的事务为自治事务 begin DBMS_OUTPUT.PUT_LINE(:new.SHSTATUS); if:new.SHSTATUS='1' and :old.ld.SHSTATUS='0' then p_main2_mx(:new.id,:new.smscontent,:new.allcode,:new.phonetype,:new.sjtongdaoid,:new.cjr,:new.pretongdaoid,:new.clientid,:new.shr,:new.pretime,:new.cjsj,:new.shstatus,:new.kouchucnt,:new.dxlx,:new.allcount); --调用存储过程,并给存储过程传参数 :new.SENDSTATUS:='1' ; end if; commit; end;
运用AT(autonomous_transaction)时,有一些注意事项,简单列举如下:
1. 在匿名PL/SQL块中,只有顶级的匿名PL/SQL块可以被设为AT
2. 如果AT试图访问被MT控制的资源,可能有deadlock发生.
3. Package 不能被声明为AT,只有package所拥有的function和procedure 才能声明为AT
4. AT程序必须以commit 或rollback结尾,否则会产生Oracle错误ORA-06519: active autonomous transaction detected and rolled back
转自:http://hi.baidu.com/wang90627/item/176418fc405ef712ff35824a
相关推荐
Oracle触发器调用Java程序 Oracle触发器是Oracle数据库中的一种机制,可以在数据库中执行特定的操作。在本文中,我们将介绍如何使用Oracle触发器调用Java程序。 一、加载Java程序 首先,我们需要将Java程序加载到...
在这个情况下,存储过程被触发器调用,用于与Java应用程序进行通信。存储过程可能包含对HTTP接口的调用,这通常通过Oracle的UTL_HTTP包实现。UTL_HTTP是Oracle提供的一组PL/SQL API,允许在PL/SQL代码中发起HTTP请求...
《Oracle触发器与存储过程高级编程》第3版是一本深入探讨Oracle数据库中触发器和存储过程技术的专业书籍。在Oracle数据库系统中,触发器和存储过程是数据库管理员和开发人员进行复杂业务逻辑处理和数据管理的重要...
本节将深入探讨“Oracle触发器与存储过程高级编程”的相关知识。 **触发器(Triggers)** 触发器是一种数据库对象,它在特定的数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行。通过定义触发器,我们可以...
1. **存储过程的创建与调用**:通过`CREATE OR REPLACE PROCEDURE`语句创建存储过程,之后可以通过`EXECUTE`语句或者直接调用存储过程名称来执行它。 2. **存储过程的参数**:存储过程可以有输入参数、输出参数和...
ORACLE 存储过程的异步调用 本文讨论了 ORACLE 存储过程的异步调用方法,旨在解决...为了测试异步调用存储过程的方法,需要建立测试环境,包括创建模拟大业务处理存储过程、读取管道动态了解处理状态的存储过程等。
例如,触发器可以调用存储过程来执行复杂的操作,或者存储过程可以作为触发器的一部分逻辑。这样可以将业务逻辑分离,提高代码的可读性和可维护性。 **应用场景** 1. **数据完整性**:触发器常用于确保数据完整性,...
本篇文章将探讨如何在Oracle触发器中调用Java程序,以扩展数据库的功能并利用Java丰富的库资源。 首先,我们需要了解Oracle的PL/SQL(Procedural Language/Structured Query Language)语言,它是Oracle数据库内置...
触发器可以调用存储过程来执行更复杂的业务逻辑,而存储过程也可以用于在触发器内部处理数据。例如,一个触发器可能在数据更新时调用存储过程来更新相关的汇总表,以维护数据的实时统计信息。 总结来说,Oracle...
Oracle 触发器调用 Java 类 Oracle 触发器是指在 Oracle 数据库中触发某些事件时执行的操作,例如插入、更新或删除数据。通过使用 Java 类,可以在触发器中执行更加复杂的操作。本文将介绍如何使用 Oracle 触发器...
在Oracle 10g中,触发器和存储过程是两个关键的数据库编程元素。触发器是一种数据库对象,它在特定的数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行,允许开发者在数据修改时执行复杂的业务规则和逻辑。存储...
【Oracle触发器的创建与使用】是数据库管理中不可或缺的一部分,尤其在Oracle数据库系统中,触发器扮演着关键角色。触发器是一种存储过程,当特定的数据库事件发生时(如INSERT、UPDATE或DELETE操作),它会被自动...