傲娇的包子 2015-10-11 19: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-15 21: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 python 下载群辉文件
  • ¥50 代码还没怎么运行但是需要代码功能调用数据
  • ¥15 vue请求不到数据,返回状态200,数据为html
  • ¥15 访问url时不会自动调用其 Servlet的doGet()
  • ¥15 用白鹭引擎开发棋牌游戏的前端为什么这么难找
  • ¥35 哪位专业人士知道这是什么原件吗?哪里可以买到?
  • ¥15 关于#c##的问题:treenode反序列化后获取不到上一节点和下一节点,Fullpath和Handle报错
  • ¥15 一部手机能否同时用不同的app进入不同的直播间?
  • ¥20 输入import torch显示Intel MKL FATAL ERROR,系统驱动1%,: Cannot load mkl_intel_thread.dll.
  • ¥15 点云密度大则包围盒小
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部