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

1、异常出现的场景.

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

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

SQL语句如下:

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


 2、问题分析

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

3、解决方案

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

SQL语句如下:

Sql代码 复制代码 收藏代码
  1. create trigger iu_table
  2. after insert or update on tr_table
  3. for each row
  4. declare --这里是关键的地方,在变量申明的地方,指定自定义事务处理。
  5. pragma autonomous_transaction;
  6. begin
  7. insert into ts_table select * from tr_table t where t.tab_id = :new.tab_id;
  8. --这里需要显示提交事务
  9. commit;
  10. 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代码 复制代码 收藏代码
  1. create trigger iu_table
  2. after insert on tr_table
  3. for each row
  4. begin
  5. insert into ts_table(tab_id,tab_name) values(:new.tab_id,:new.tab_name);
  6. --这里需要注意,要知道不同的触发类型其特殊变量:new和:old保存的值的区别。
  7. --commit; 注意使用方案二,这里不能显示的进行提交操作操作,trigger中在没有声明自定义事务管理的时候,不能执行显示提交。
  8. end iu_table;   

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ORA-03114: 未连接到Oracle。 这个错误通常是由于连接到Oracle数据库的会话已经断开或失效导致的。可能的原因包括网络故障、数据库服务器故障、会话超时或管理员强制终止会话等。 要解决这个问题,您可以尝试重新连接到数据库,或者检查网络连接是否正常。如果问题仍然存在,您可能需要联系数据库管理员以获取更多帮助。 ### 回答2: ORA-03114: Not Connected to Oracle是一种Oracle数据库的错误,表示数据库与应用程序之间的连接已经断开。当这种错误出现时,用户将无法继续正常访问数据库,无法读取或修改数据。 通常情况下,这个错误发生的原因是因为连接失效或因为数据库出现了故障。以下是一些导致ORA-03114错误的原因: 1. 网络故障 若连接在传输过程中出现异常,就会导致ORA-03114错误。 建议检查网络连接是否稳定,或考虑使用更稳定的网络环境。 2. 数据库关闭 如果数据库已从服务器上卸载,或者数据库服务已被关闭,则无法继续进行对该数据库的访问,这种情况下会出现ORA-03114的错误。 3. 登录超时 当用户连接数据库超过指定的时间后,将会导致用户已经不再处于连接状态,从而发生ORA-03114的错误。 4. 连接被意外中断 如果在应用程序尝试连接数据库的过程中,连接被意外中断,该错误也可能产生。 针对ORA-03114错误,可以采取以下解决办法: 1. 确保网络稳定 在网络稳定的前提下进行数据库连接,确保数据传输过程中不会出现异常。 2. 重新连接数据库 如果数据库连接断开,可以尝试重新连接,确保可以正常连接并访问数据库。 3. 检查数据库服务 检查数据库服务是否已经启动,并保持运行状态,确认可以通过网络连接到该数据库服务。 4. 增加登录超时时间 在应用程序连接数据库时,可以通过增加登录超时时间来避免因超时而导致的连接断开。 总之,ORA-03114错误可能会由多种原因引起,例如网络故障或数据库故障等。一旦检测到该错误,则必须深入分析并采取必要的解决方案,以确保数据库可以正常连接并运行。 ### 回答3: ora-03114: not connected to oracle是Oracle数据库的一个常见错误,它表示客户端应用程序和Oracle数据库之间的链接断开了,通常是由于网络问题或数据库服务器故障导致的。这个错误通常会使应用程序无法继续执行,因此必须及时解决这个问题。 要解决ORA-03114错误,需要先确认数据库服务器是否能够响应请求,也就是检查数据库服务器是否正常工作。如果服务器无法响应请求,就需要确认是否存在错误日志来获取更多细节,确认问题的根本原因。如果是由于网络问题导致的连接问题,可以通过检查网络连接的状态来解决。网络通常是导致ORA-03114错误的常见原因之一,所以需要确保网络连接稳定并且没有丢包或延迟。 在数据库服务器无任何问题的情况下,可能需要检查客户端应用程序和数据库之间的连接设置。如果连接设置不正确,也可能导致ORA-03114错误。检查连接设置的最佳方法是开启客户端应用程序的日志记录功能,从日志中查看该错误的更多详细信息,确认连接参数是否正确设置。 最后,还需要确认用户是否有访问数据库服务器的权限。如果权限不足,客户端应用程序无法连接到数据库服务器,也会触发ORA-03114错误。确认用户的权限并授权相应访问权限,可以解决这个问题。 总之,ORA-03114错误是Oracle数据库的一个常见错误,需要通过检查数据库服务器状态、网络连接、连接设置和用户权限等方面来查找原因,并采取相应的措施加以解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值