当前位置:  数据库>oracle

关于ORA-04091异常的出现原因,以及解决方案

    来源: 互联网  发布时间:2017-05-24

    本文导语: 1、异常出现的场景. 在使用Hibernate做为项目持久层的情况下,需要对某一张表进行一个扩展,扩展操作便是在该表上创建一个触发器。将表中的数据读入到其他表中。 SQL语句如下: drop table tr_table;  create table tr_table(  --触发器...

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;

相关阅读:

Oracle触发器给表自身的字段重新赋值出现ORA-04091异常


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 出现ORA-01401和ORA-01008错误?
  • oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法
  • 安装oracle出现error:ora-01031:insufficient privilleges的解决
  • Oracle 数据库闪回功能设置出现ORA-19809和ORA-19804错误
  • Linux 下数据库oracle出现ORA-27102错误的解决办法
  • ORACLE出现错误1033和错误ORA-00600的解决方法
  • Eclipse连接Oracle数据库的ORA-00604 ORA-12705错误
  • oracle ORA-01114、ORA-27067错误解决方法
  • Oracle不能删除表 ORA-00604 ORA-01422 错误
  • 如何得到带有ora的行的下一行
  • 如何配置 linux 下 oracle 的 listener .ora 和
  • 浅析如何在tnsnames.ora中配置监听
  • Orcle的package中访问其它Schema的表报错ORA-00942解决方法
  • [Oracle] 浅析令人抓狂的ORA-01555问题
  • 解决报错ora-32035的方法分析
  • aq.executeQuery: ORA-00020: maximum number of processes (59) exceeded
  • ORA-00947:Not enough values (没有足够的值)的深入分析
  • solaris10 安装 ora9.2.0.1 时报错
  • 在UNIX下,我的ORA817该怎么样才可以自己启动呀?
  • 基于ORA-12170 TNS 连接超时解决办法详解
  • plsql连接oracle数据库报ora 12154错误解决方法
  • 谁能帮忙解释一下: ORA-01000 : maximun open cursors exceeded
  • 关于Oracle游标的问题(ORA-01000: maximum open cursors exceeded)
  • 我在Linux7。3下面装了一个Oracle8i,但是现在启动不起来了,总是报错ORA-01031: insufficient privileges
  • oracle 11g导出数据时报ORA 1455错误的处理方法
  • zilong28提问:Tomcat3.2报错内容是Error occurs when connecting DB: ORA-00020: maximum number of processes(59) exceeded 我应该如何解决,先谢了


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,