傲娇的包子 2015-10-12 03:05 采纳率: 50%
浏览 2757
已采纳

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中.

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

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

  • 写回答

5条回答 默认 最新

  • WorldMobile 2015-10-16 05:35
    关注

    或者参考一下这个

    相信写过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,搞定。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog