设为首页 收藏本站
查看: 624|回复: 0

[经验分享] oracle触发器调用存储过程

[复制链接]

尚未签到

发表于 2016-7-27 08:34:27 | 显示全部楼层 |阅读模式
  触发器传参数给存储过程,存储过程中有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
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-249945-1-1.html 上篇帖子: Global Temporary Table in Oracle(原创) 下篇帖子: ORACLE如何修改用户表空间
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表