关于ORA-04091异常的出现原因,以及解决方案
2014-01-18 14:48
357 查看
1、异常出现的场景.
:在使用Hibernate做为项目持久层的情况下,需要对某一张表进行一个扩展,扩展操作便是在该表上创建一个触发器。将表中的数据读入到其他表中。-4091,ORA-04091: 表 DD123.DO_TABLE_47 发生了变化, 触发器/函数不能读它
SQL语句如下:
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语句如下:
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;
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语句如下:
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;
相关文章推荐
- 关于ORA-04091异常的出现原因,以及解决方案
- 关于ORA-04091异常的出现原因,以及解决方案
- Android 3.0获取互联网资源时出现异常的原因分析以及解决方案
- 网页使用ie或者360打开时按F12出现程序停止运行异常的原因以及解决方案
- 关于VC出现 0x0C150002 错误的原因以及解决方案
- 关于Android Force Close 出现的原因 以及解决方法
- Mysql5.7 only_full_group_by以及其他关于sql_mode原因报错详细解决方案
- 服务器因为其他原因打了系统补丁,导致.net2.0损坏,IIS以及运行.net2.0的程序出现异常
- 关于oracle“ORA-01810格式代码出现两次”的解决方案
- Mysql only_full_group_by以及其他关于sql_mode原因报错详细解决方案
- 关于用VS写C程序运行时出现"烫"字以及乱码的问题的原因
- 关于异常的小程序出现debug assertion failed!错误的原因是什么?
- php进行递归时出现Call to a member function 方法() on null的原因以及解决方案
- 关于Load Balance出现ViewState异常的解决方案
- 关于项目中出现乱码的原因有哪些以及解决的办法
- 关于ORA-02069错误[序列原因解决方案]
- 关于struts2+hibernate3.2中出现的java.lang.ClassCastException: java.lang.Integer异常的解决方案
- oracle变异表触发器中ORA-04091错误原因及解决方案
- Java中关于内存泄漏出现的原因以及如何避免内存泄漏
- 关于Android Force Close 出现的原因 以及解决方法