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

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条)

报告相同问题?

悬赏问题

  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥15 想用@vueuse 把项目动态改成深色主题,localStorge里面的vueuse-color-scheme一开始就给我改成了dark,不知道什么原因(相关搜索:背景颜色)
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备
  • ¥100 如何用js写一个游戏云存档