oracle-ORACLE 触发器中 使用游标查询 本表 报错ORA-04091

问题描述

ORACLE 触发器中 使用游标查询 本表 报错ORA-04091

racle 触发器.
监听表A 更新 更新后触发.
其中 使用游标查询表A 数据.
OPEN 游标时
会报 ORA-04091:表A发生了变化,触发器/函数不能读它

于是增加了自定义事物 pragma autonomous_transaction;
增加事物之后不报错了.但是OPEN 的游标 没有获取到任何数据.

想做到的效果是

是这样. 比如说表A里面有4条数据
1 aaaa
2 bbbb
3 cccc
4 dddd

完后在修改其中一条数据之后. 查询其余没有修改的3条数据.在插入到表B中.

所以这里我想查询触发器监听的表.

我应该怎么处理?有什么好的建议.我刚才尝试了一下勇士图 依然会同样报错

解决方案

或者参考一下这个

相信写过ORACLE行级触发器的IT同仁们大多遇到过ORA-04091问题,即在某表的行级触发器中不能读取当前表的问题,如:

create table test(id raw(16), name varchar2(100), primary key (id));
create table test_count(test_count int);
insert into test_count values(0);
commit;
create or replace trigger t_test
AFTER INSERT OR DELETE ON test
FOR EACH ROW
BEGIN
UPDATE test_count
SET test_count = (SELECT count(*) from test);
END t_test;
/

当您在插入test表时,系统会抱怨(当然计数这样的简单业务是不需要使用触发器来做的,仅用于举例):

第 1 行出现错误:
RA-04091: 表 TEST.TEST 发生了变化, 触发器/函数不能读它
RA-06512: 在 "TEST.T_TEST", line 2
RA-04088: 触发器 'TEST.T_TEST' 执行过程中出错

前几天看到触发器的INSTEAD OF子句,顺便用它搞定:

drop trigger t_test;
create view v_test as select id, name from test;
create or replace trigger t_v_test
INSTEAD OF INSERT OR DELETE OR UPDATE ON v_test
FOR EACH ROW
DECLARE
BEGIN
IF inserting THEN
INSERT INTO test(id, name) values(:new.id, :new.name);
END IF;
IF deleting THEN
DELETE FROM test WHERE id = :old.id;
END IF;
IF updating THEN
UPDATE test
SET id = :new.id, name = :new.name
WHERE id = :old.id;
ELSE
UPDATE test_count
SET test_count = (SELECT count(*) from test);
END IF;
END t_v_test;
/

原来对test表的插入改为对v_test插入,一切OK,搞定。

解决方案二:

行级触发器是不允许select自身的,需要表级触发器才可以引用自身,建议你换个方法来实现

解决方案三:

ORACLE的触发器规则中,不能读取已经发生变更但没有提交事务的数据,修改前的内容使用 old.field 获取,修改后的值使用 new.field 获取,其中 field 是你的字段名

解决方案四:

第 1 行出现错误:
RA-04091: 表 TEST.TEST 发生了变化, 触发器/函数不能读它, line 2
RA-04088: 触发器 'TEST.T_TEST' 执行过程中出错 就是这个意思,建议看下触发器、函数的使用,

解决方案五:

第 1 行出现错误:
RA-04091: 表 TEST.TEST 发生了变化, 触发器/函数不能读它, line 2
RA-04088: 触发器 'TEST.T_TEST' 执行过程中出错 就是这个意思,建议看下触发器、函数的使用,

解决方案六:

Oracle 触发器中使用游标

时间: 2024-08-08 02:13:36

oracle-ORACLE 触发器中 使用游标查询 本表 报错ORA-04091的相关文章

ab表数据 插入c数据-特急!触发器中当新增1个表中数据,查询相关数据,把查询出来的数据插入另外一张表

问题描述 特急!触发器中当新增1个表中数据,查询相关数据,把查询出来的数据插入另外一张表 使用触发器,根据条件查询出a和b表中数据,插入到c表. create table a ( fid VARCHAR2(44), fname_l2 VARCHAR2(255),//名称 b_fid VARCHAR2(44),//b表的id fnumber NVARCHAR2(80) ); create table b ( fid VARCHAR2(44), fname_l2 VARCHAR2(255),//名称

oracle用户可以tnsping通、普通用户tnsping报错的问题

今天碰到了一个有趣的问题 oracle用户可以tnsping通,普通用户tnsping报错 用普通用户tnsping数据库的时候报 TNS-03505: Failed to resolve name 而用oracle用户tnsping数据库的时候却可以ping通 <34 linux-sit:/home/smsds>tnsping orarpt TNS Ping Utility for Linux: Version 11.1.0.6.0 - Production on 24-DEC-2011 1

mysql-java中的sql语句为何会报错,而到了workbench就可以执行

问题描述 java中的sql语句为何会报错,而到了workbench就可以执行 rt基本上是timestamp的格式,比如insert into table values ('2015-03-17 00:00:00');这句话在java通过jdbc执行就会报错,而直接在workbench下面操作就没有问题为什么会这样? 解决方案 可能是字符串单引号等引起的,打印代码中的字符串跟workbench中比较 解决方案二: insert into table(字段1,字段2....) value( 值1

安卓开发 数据库查询的时候报错

问题描述 安卓开发 数据库查询的时候报错 E/AndroidRuntime(25236): java.lang.IllegalStateException: Process 25236 exceeded cursor quota 100, will kill it 解决方案 sqlite的错,是不是你的查询有问题 解决方案二: 看看数据库游标是不是关闭了,是不是在db关闭前关闭了游标cursor

wamp环境中,本可以使用GD库,但在zend中无法使用GD库,会报错这是为什么,出了什么问题

问题描述 wamp环境中,本可以使用GD库,但在zend中无法使用GD库,会报错这是为什么,出了什么问题 在zend中无法使用GD库,会报错提示GD库函数未定义 解决方案 http://blog.csdn.net/authorzhh/article/details/7566853 看看是不是扩展没有开 解决方案二: 扩展开了, extension=php_gd2.dll 前分号去掉了,还是没解决

compression-AIX中compress压缩一个小文件报错

问题描述 AIX中compress压缩一个小文件报错 AIX中compress压缩compression does not save space

c++-ado与数据库连接时成功了,但用参数化查询时却报错unkown error 0x800A0E7D

问题描述 ado与数据库连接时成功了,但用参数化查询时却报错unkown error 0x800A0E7D 数据库用的是server 2005,但在下载时遇到了问题,,后来求助网上,完成后,程序名却叫microsoft sql server studio express,不晓得是不是数据库的问题. 希望大神指点! 以下是我的代码:我在CADOcon定义了_connectionptr指针,所以connection这一部分应该是没问题的.void AddUser::OnOK() { // TODO:

pom文件中引用org.apache.maven.plugins报错

问题描述 pom文件中引用org.apache.maven.plugins报错 错误:Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (execution: default-testCompile phase: test-compile) 解决方案 maven pom 报错 Failed to execut

easyui跳回登录界面-.net中 easyui在mvc过滤器处理报错时怎么跳回到登录界面

问题描述 .net中 easyui在mvc过滤器处理报错时怎么跳回到登录界面 .net中 easyui在mvc过滤器处理报错时怎么跳回到登录界面 我用mvc的过滤器做了一个全局的异常处理,前台是用的easyui框架,报错后想跳回登录界面,可是一直跳转不出去求大神帮忙解决 跳转方法: public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new LoginCheckFilterA