关于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;
分享到:
相关推荐
#### 三、解决方案建议 ##### 1. 增加process和session的连接数 为了防止由于连接数达到上限而导致的ora-12520错误,可以通过调整`processes`和`sessions`参数来提高并发连接能力。这通常需要在每个实例的`spfile`...
在深入探讨解决方案之前,我们首先需要了解ORA-29275错误的具体原因。这一错误的发生通常与以下因素有关: 1. **表中的VARCHAR2字段存储了多字节字符**:如果某个字段的数据类型为VARCHAR2,并且其长度限制不足以...
oracle12c程序连接时异常: ORA-01017: 用户名/口令无效; 登录被拒绝 的解决方案。
以下是对"ORA-01033: ORACLE initialization or shutdown in progress"错误的详细分析及可能的解决方案。 **错误解释:** ORA-01033错误表示Oracle正在启动或关闭过程中,这可能是由于多种原因导致的,如数据库实例...
本文将详细介绍不同类型的ORA-600错误及其解决方案,帮助读者理解如何应对这些复杂问题。 ##### 1.2. 常见步骤—METELINK上查询 由于ORA-600错误通常涉及Oracle数据库内部组件的问题,因此可以通过Oracle官方支持...
#### 四、解决方案 针对上述情况,可以采取以下步骤解决问题: 1. **扩大表空间**: - 修改表空间的最大限制,使其能够适应当前的数据增长需求。 - 使用ALTER TABLESPACE命令调整表空间大小,例如: ``` ALTER...
#### 解决方案 为了修正这个问题,需要调整 `v_info` 变量的大小以匹配数据库中 `WHOISINFO` 列的实际大小。具体做法是在存储过程中显式指定 `v_info` 的大小: ```sql CREATE OR REPLACE PROCEDURE GET_WEBSITE_...
在Oracle数据库操作中,我们...当遇到具体异常时,结合Oracle的错误代码(如ORA-XXX)查找官方文档或在线资源,通常能找到具体的解决方案。在编程时,采用异常处理机制,捕获并处理这些错误,能有效提高程序的健壮性。
- **解决方案**: 处理两阶段提交过程中的异常。 #### ORA-02057:2PC::Чλָ״̬ţԴڣ - **含义**: 两阶段提交中的状态问题。 - **解决方案**: 检查状态设置。 #### ORA-02058:δҵID - **含义**: 缺少有效的ID...
超出打开游标的最大数的原因和解决方案 在 Oracle 数据库中,游标(cursor)是一种临时工作区,用于存储查询结果。每个会话可以打开多个游标,但存在一个限制,即 OPEN_CURSORS 参数指定的最大游标数。如果应用程序...
##### 1.7 ORA-04091 - **特征**: - 触发器工作异常。 - **原因**: - 当触发器试图读取或修改正在被修改或插入的数据时可能会发生此错误。 - **措施**: - 检查触发器脚本,确保其引用的完整性。 ##### 1.8 ...
#### 四、解决方案建议 1. **备份数据**:在进行任何操作之前,确保对数据库中的重要数据进行了完整的备份。 2. **执行索引检查**:如上述步骤所示,检查并记录索引的状态。 3. **索引重建**:如果发现索引存在问题...
ORA-00600 错误通常被视为 Oracle 数据库中最严重的一类错误之一,这类错误通常意味着数据库内核中出现了某种异常情况。由于这类错误往往与数据库的核心组件紧密相关,因此它们通常难以诊断和修复,并且可能对数据库...
- 错误信息通常包含错误发生的原因、影响以及可能的解决方案或建议。 - 对于复杂错误,可能需要结合日志文件和其他诊断工具进行深入分析。 - 了解错误码可以帮助预防潜在问题,通过优化SQL语句、调整参数设置等...
4. ORA-00021, ORA-00022, ORA-00023, ORA-00024, ORA-00025, ORA-00026, ORA-00027, ORA-00028, ORA-00029: 会话和进程相关的错误 这些错误涉及会话状态、ID或权限问题。解决方法包括检查会话配置、用户权限,以及...
在Oracle数据库环境中,ASM(Automatic Storage Management)是一个集成的存储管理解决方案,用于简化数据库的存储管理。当出现“无法启动ASM实例1”的问题时,这通常意味着ASM实例未能成功启动,可能由于多种原因...
本文将基于提供的文档信息对Oracle中常见的异常问题进行归纳总结,并提供相应的解决方案。这些异常包括但不限于`ORA-12651:TNS:没有监听器`、`ORA-12545:因目标主机和对象不存在,连接失败`、`ORA-12560:TNS:协议...
3. **联系Oracle支持**:由于ORA-00600是内部错误,可能需要Oracle官方的技术支持来解析错误代码和参数的含义,以及提供解决方案。 4. **应用补丁**:像题目中提供的8922013这样的补丁,可能就是为了解决特定的ORA-...
### Oracle异常详解 #### ORA-0001:DUP_VAL_ON_INDEX ...了解这些异常的原因和解决方案有助于提高数据库应用的稳定性和效率。对于每一种异常,都应该采取相应的预防措施和处理策略,确保应用程序能够平稳运行。