2013年1月18日调试触发器“表发生了变化,触发器或函数不能读它”的出现原因,以及解决方案

1、异常出现的场景.

:在使用Hibernate做为项目持久层的情况下,需要对某一张表进行一个扩展,扩展操作便是在该表上创建一个触发器。将表中的数据读入到其他表中。

SQL语句如下:

drop table tr_table;   
  
    create table tr_table(  --触发器作用表   
    tab_id number primary key,   
    tab_name varchar2(30) NOT NULL  
    )   
  
    create table ts_table as select * from tr_table; --提供扩展功能的表   
               
    --定义的触发器,在tr_table表插入和更新数据之后向ts_table表插入当前操作的信息行。   
    create trigger iu_table   
    after insert or update on tr_table   
    for each row   
    begin  
        insert into ts_table select * from tr_table t where t.tab_id = :new.tab_id;   
    end is_table;   
  
    --对tr_table执行插入操作,触发ts_table插入操作   
    insert into tr_table(tab_id,tab_name) values(1,‘test‘);   
       
    --弹出错误信息提示   
    --ORA-04091:表tr_table发生了变化 触发器/函数不能读它   
    --ORA-06512: 在iu_table line 2   
    --ORA-04088: 触发器iu_table 执行过程中出错

2、问题分析

:在Oracle中执行DML语句的时候是需要显示进行提交操作的。当我们进行插入的时候,会触发触发器执行对触发器作用表和扩展表的种种操作,但是这个时候触发器和插入语句是在同一个事务管理中的,因此在插入语句没有被提交的情况下,我们无法对触发器作用表进行其他额外的操作。如果执行其他额外的操作则会抛出如上异常信息。

3、解决方案

:1,我们知道,出错的原因是因为触发器和DML语句在同一事务管理中,所以方案一便是将触发器和DML语句分成两个单独的事务处理。这里可以使用Pragma autonomous_transaction; 告诉Oracle触发器是自定义事务处理。

SQL语句如下:

create trigger iu_table   
    after insert or update on tr_table   
    for each row   
    declare  --这里是关键的地方,在变量申明的地方,指定自定义事务处理。   
    pragma autonomous_transaction;    
    begin  
        insert into ts_table select * from tr_table t where t.tab_id = :new.tab_id;   
    --这里需要显示提交事务   
        commit;   
    end iu_table;

   :2,在Oracle Trigger中有:new,:old两个特殊变量,当触发器为行级触发器的时候,触发器就会提供new和old两个保存临时行数据的特殊变量,我们可以从俩个特殊的变量中取出数据执行扩张表的DML操作。

SQL语句如下:

   

create trigger iu_table   
    after insert on tr_table   
    for each row   
    begin  
        insert into ts_table(tab_id,tab_name) values(:new.tab_id,:new.tab_name);   
        --这里需要注意,要知道不同的触发类型其特殊变量:new和:old保存的值的区别。   
        --commit; 注意使用方案二,这里不能显示的进行提交操作操作,trigger中在没有声明自定义事务管理的时候,不能执行显示提交。   
    end iu_table;

如果您觉得文章有用,也可以给水发个微信小额红包鼓励鼓励!!!

时间: 2024-11-07 02:20:14

2013年1月18日调试触发器“表发生了变化,触发器或函数不能读它”的出现原因,以及解决方案的相关文章

ORA-04091: 表 发生了变化, 触发器/函数不能读它

触发器中新调用了一个存储过程. 触发器: create or replace trigger tr_credits_wzclorder_clwzjk after update on app_wzclorder for each row declare ... begin ... p_integral_ticket_refund(:new.ordernumber,:new.userid); ... end; 存储过程: create or replace procedure p_integral_

2013年9月18日网易社招

一.算法编程 1.f(0)=0;f(1)=1; f(n)=f(n-1)+f(n-2) 求f(n) 2.有主字符串A,子字符串B,在A中查找B “看毛片”算法. 3.写出你熟悉的排序算法,并说明其优缺点 快速排序和归并排序. 二.Mysql题目 1.将table中的数据全部拷贝到新表table_r中 2.mysql的三种驱动类型?mysql锁? 三.Java题目 1.string为什么不会变 因为底层实现的数组是final的. 2.多态是什么?怎样实现多态? 多态是指不同类的对象对相同的消息作出不

软考信息系统监理师 2016年3月18日作业

软考信息系统监理师,2016年3月18日作业: 第四章 监理单位的组织建设 1.监理单位的体系建设分为哪3部分? 答:分为业务体系建设.质保体系建设.管理体系建设 2.监理单位监理服务质量管理的方式有2种,哪2种?优缺点是什么? 答:一种是以单位管理为主,一种是以监理项目部自我管理为主. 以单位管理为主的质量管理模式的优点是可以保证单位各个监理项目部按照统一 的要求进行监理,易于控制;缺点是限制了总监理工程师质量控制的积极性,管 理费用大.以监理项目部为主的质量管理模式的优点与缺点正好相反. 3

12月18日风险投资速递:Facebook收购实时体育数据提供商Sport Stream

国内公司 1.手游公司成都掌沃无限获得近千万元天使投资 成都掌沃无限成立于2013年,是一家新成立的手机游戏开发商,创始人及CEO张涛拥有超过10年的游戏行业从业经验和连续创业经历,其首款游戏产品为<三国战神>,正在测试阶段.该公司在成立之初获得两家结构近1000万元的天使投资,据传其中一家为真格基金. 2.招聘服务"哪上班"获得新一轮天使投资 哪上班(http://www.nashangban.com /)是一个IT职位招聘服务网站,是专注服务于互联网界人才与企业的非社交

10月18日随笔

1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 #include<queue> 7 using namespace std; 8 typedef long long LL; 9 inline int read() 10 { 11 int x=0,f=1;char c=getchar

2015年8月18日,杨学明老师《技术部门的绩效管理提升(研讨会)》在中国科学院下属机构CNNIC成功举办!

2015年8月18日,杨学明老师为中国网络新闻办公室直属央企中国互联网络中心(CNNIC)提供了一天的<技术部门的绩效管理提升(研讨会)>培训课程.杨学明老师分别从研发绩效管理概述.研发绩效的考核与评价管理.标杆企业研发绩效管理及结果的应用.激励和奖金分配等方面进行了讲解和研讨.培训过程中,杨学明老师以阿里巴巴.腾讯.华为等企业的互联网产品规划的真实案例为主线,充分发挥学员在学习过程中的智慧,进行了深入的研讨和演练.并给大家分享了来自华为.腾讯.阿里巴巴的一些绩效和激励案例,大家认为受益匪浅.

冲刺阶段(二)第五天 5月18日

昨天:利用前几天学习的知识实现铁大助手中图片切换的功能. 今天:团队测试 困难:不能在所有Android版本模式下运行本软件,有的不能兼容. 冲刺阶段(二)第五天 5月18日,布布扣,bubuko.com

软考信息系统监理师,2016年3月18日作业

软考信息系统监理师,2016年3月18日作业: 第四章 监理单位的组织建设1.监理单位的体系建设分为哪3部分?2.监理单位监理服务质量管理的方式有2种,哪2种?优缺点是什么?3.监理服务质量的控制方式,按照时间可以分为哪3种?按照控制主体分为什么?按照评价方式分为什么?4.监理服务质量控制的内容包括哪些?5.监理单位遵照什么步骤建立和完善质量保证体系?6.监理单位的权利中,应按照""的原则,开展监理工作?7.监理单位的行为准则是什么?8.在行为准则中,什么是公正,什么是独立,什么是科学

谷歌CEO 宣布Google I/O 2016大会将于2016年5月18日Mountain View举办

谷歌CEO Sundar Pichai今日在他的官方Twitter上宣布,Google I/O 2016大会将于2016年5月18日在加州Mountain View拉开帷幕. 这是谷歌一年一度最大的开发者大会.在刚刚过去的2015年,Google I/O大会被评为2015年最受欢迎的开发者大会,位列苹果,微软等各大开发公司大会之首. 你可以通过以下链接订阅Google I/O 2016的新闻已经该大会官方内容. 此外,如果你想体验以下2015年的Google I/O大会,可以观看如下Google