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

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

 

 

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; 
 

 

深入解析ORA-04091:Oracle触发器与函数中的表访问冲突及自治事务解决方案 本文深入解析Oracle数据库中常见的ORA-04091错误,探讨触发器与函数中的表访问冲突问题及其解决方案。重点介绍自治事务(Autonomous Transaction)的工作原理、使用方法和最佳实践,帮助开发者有效避免数据不一致问题,提升数据库应用的稳定性和性能。 阅读详情

相关推荐

【学习路线】 游戏客户端开发入门到进阶

游戏开发是一个交叉性极强的技术领域,对开发者提出了高维度的要求。作为初学者,不要急于求成,打牢基础、注重原理、勤于实践,你的成长将会非常快速而稳健。希望这份学习路线与书单能为你指明方向,迈出职业开发者的第一步。

hhw_hhw的博客 2128

errno: -4091端口被占用

errno: -4091端口被占用

qq_48704579的博客 1280

PPO(Proximal Policy Optimization)算法原理及实现,详解近端策略优化

接着上面的讲,PG方法一个很大的缺点就是参数更新慢,因为我们每更新一次参数都需要进行重新的采样,这其实是中on-policy的策略,即我们想要训练的agent和与环境进行交互的agent是同一个agent;与之对应的就是off-policy的策略,即想要训练的agent和与环境进行交互的agent不是同一个agent,简单来说,就是拿别人的经验来训练自己。举个下棋的例子,如果你是通过自己下棋来不断提升自己的棋艺,那么就是on-policy的,如果是通过看别人下棋来提升自己,那么就是off-policy的。

weixin_41106546的博客 9万+

vscode报错:errno: -4091, syscall: ‘listen‘, address: ‘::‘, port: 3000

关于端口被占用报错

weixin_63298816的博客 1393

别再瞎调参数了!用MATLAB fmincon优化傅里叶级数,为你的机器人设计“完美”激励轨迹

本文详细介绍了如何利用MATLAB的fmincon优化器设计机器人激励轨迹,通过优化傅里叶级数参数,解决传统试错法的低效问题。文章涵盖了目标函数设计、约束条件转化及优化算法选择,帮助工程师实现高精度的系统辨识和动力学参数优化。

weixin_42613501的博客 240

Synares病毒实战:如何手动清除C盘隐藏的Synaptics.exe(附资源修复脚本)

本文详细介绍了Synares感染型病毒的手动清除方法,该病毒伪装成Synaptics触摸板驱动,感染EXE和XLSX文件。文章提供了从病毒行为分析、母体清除到被感染文件修复的全流程指南,并附有实用的资源修复脚本和防御加固方案,帮助用户彻底清除这一顽固病毒。

lg888的博客 2338

ORA-04091错误原因与解决方法

最近工作中写了一触发器报错:ORA-04091:table XX  is mutating, trigger/function may not see it。 下面通过官方文档及网友提供资料分析一下错误原因及解决方法: 1.查看oracle官方文档: 原因:触发器(或者被语句中引用的用户自定义PL/SQL函数)视图去查询(或修改)一个被另一语句修改而触发的表。 解决方法:重写触发器

老徐的博客只有干货 9662

海康威视门禁考勤设备数据对接实战:从被动推送到主动拉取

本文深入探讨了海康威视门禁考勤设备数据对接的两种核心方案:HTTP推送与SDK主动拉取。文章对比了两种方式的适用场景、技术实现与优缺点,为开发者提供了从设备配置、代码编写到工程化部署的完整实战指南,帮助读者根据项目规模、网络环境及数据稳定性要求,做出最合适的技术选型。

weixin_29284657的博客 668

errno: -4091, syscall: ‘listen‘, address: ‘::‘, port: 8000

errno: -4091, syscall: 'listen', address: '::', port: 8000

abcccc1111901的博客 2168

使用PlotNeuralNet绘制深度学习网络图的基本操作

使用PlotNeuralNet绘制深度学习网络图的基本操作

weixin_46877907的博客 2110

Go语言爬虫:chromedp 的详细使用

chromedp 是 Go 语言中无头浏览器自动化的终极利器。它能驱动真实的 Chrome 浏览器,处理 JavaScript 渲染、复杂交互和反爬虫机制

数据知道的博客 4492

关于trigger

开发的同事报告说,某trigger不管满足不满足它的条件都会触发。听上去有点怪,于是过去看他重现。果然是这样。 他的过程是首先对表A创建一个for each row,insert before的trigger,...

ctest3001的专栏 259

多目标优化AI Agent:增强LLM的复杂决策能力

在人工智能领域,尤其是自然语言处理(NLP)和大语言模型(LLM)的应用中,决策问题往往涉及多个目标的平衡与优化。例如,在智能客服系统中,既要提高客户满意度,又要降低运营成本;在自动驾驶中,既要确保安全,又要追求行驶效率。传统的单目标优化方法难以满足这种复杂场景的需求,因此多目标优化成为了一种必然趋势。AI Agent是一种智能系统,能够通过感知环境、处理信息并采取行动来实现特定目标。它可以是一个软件程序,也可以是一个物理设备。NSGA-II:一种基于群体的多目标优化算法,通过遗传算法的思想进行迭代优化。

AI天才研究院 1300

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

业务描述如下: 在插入一个表的时候,需要根据一个字段的值更新另一个字段的值。当然也可以通过程序就能很简单得实现,只是这个字段只是数据交换用,和系统主业务没关系,不想修改程序,所以才用触发器的方式实现。 表结构定义和触发器定义如下: create table debug_demo1( id varchar(32), name varchar(100), note varchar(2

专注于Java技术、软件架构设计、数据分析 1590

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

--废话不多说,直接看代码 -----第一个触发器 CREATE OR REPLACE TRIGGER tri_id_seq_do_386_action--车险政策主表状态修改时关联修改子表状态 AFTER UPDATE ON do_table_386 FOR EACH ROW DECLARE BEGIN   UPDATE do_table_388 SET fd12 = :n

u012069924的专栏 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

oracle创表00922错误,Oracle变异表解决方法--ORA-04091错误

原因:触发器(或者被语句中引用的用户自定义PL/SQL函数)视图去查询(或修改)一个被另一语句修改而触发的表。解决方法:重写触发器(或函数)避免读该表。对表进行DELETE,UPDATE,INSERT操作时,所操作的表就变成了变异表,对表的行级(FOR EACH ROW)触发器中不能对该表进行DML操作。这时可以使用两个方法解决。[@more@]1、采用自治事务pragma autonomous_...

weixin_42500426的博客 585

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

Oracle下插入一个表的时候,需要根据一个字段的值更新另一个字段的值。当然也可以通过程序就能很简单得实现,只是这个字段只是数业务描述如下:Oracle下插入一个表的时候,需要根据一个字段的值更新另一个字段的值。当然也可以通过程序就能很简单得实现,只是这个字段只是数据交换用,和系统主业务没关系,,不想修改程序,所以才用触发器的方式实现。表结构定义和触发器定义如下:create table debu...

weixin_39572168的博客 235

Oracle触发器实战:如何用自治事务解决ORA-04091报错(附完整代码示例)

本文深入解析Oracle触发器中的ORA-04091报错问题,通过自治事务(autonomous_transaction)提供完整解决方案。文章详细介绍了自治事务的工作原理、适用场景及实战代码示例,帮助开发者高效解决这一经典问题,提升数据库操作的稳定性和性能。

weixin_29228781的博客 204

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

--废话不多说,直接看代码-----第一个触发器CREATE OR REPLACE TRIGGER tri_id_seq_do_386_action--车险政策主表状态修改时关联修改子表状态AFTER UPDATE ON do_table_386FOR EACH ROWDECLAREBEGINUPDATE do_table_388 SET fd12 = :new.fd17 WHERE parent...

weixin_29243279的博客 842

trigger抛出异常ORA-04091:table ...... is mutating, trigger/function may not see it

1.问题描述 今天做一个触发器例子,假设为A表写一个触发器A_trigger,在触发器中对本表(A表)进行DML,然后抛出异常:ORA-04091:table ...... is mutating, trigger/function may not see it 2.问题产生的原因: 这是有在被触发TRIGGER工作的时候,默认把当前表 (表)锁死,不允许对其进行操作,不允许对其进行操作,.

JavaCode 1934
上一篇: Java 排序方法
下一篇: Java jdbc调用Oracle数据库存储过程
perfectPlans
博客等级 码龄14年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值