`

行级触发器对当前表操作,”ORA-04091: 表 COMPANY 发生了变化, 触发器/函数不能读它“,解决方法

 
阅读更多

 

行级触发器对当前表操作,”ORA-04091: 表 COMPANY 发生了变化, 触发器/函数不能读它“,解决方法:

1、自动产生另外一个独立的TRANSACTION,一般需要在其中写commit,见红色内容

 

create or replace trigger odpaydetailTrigger
  before insert or update on order_pay_detail  
  for each row
declare
  PRAGMA AUTONOMOUS_TRANSACTION;--自动产生另外一个独立的TRANSACTION,一般需要在其中写commit
  -- local variables here 一个订单 pay_reason=‘MAIN’只能有一个
  detailcount int;
  
begin
  if :new.pay_reason='MAIN' then 
     begin
          if inserting then
                begin
                        select count(1) into detailcount from order_pay_detail opd where opd.order_package_id=:new.order_package_id and opd.pay_reason='MAIN' AND PAY_SUC='Y';
                        if detailcount>=1 then
                           begin
                                 raise_application_error(-20020, '重复插入类型为MAIN的支付明细');
                           end;
                        end if;
                 end;
           end if;
           if updating then
                begin
                        --select count(*) into detailcount from order_pay_detail opd where opd.order_package_id=:new.order_package_id and opd.pay_reason='MAIN';
                        if (:new.pay_reason<>:old.pay_reason or :new.PAY_SUC<>:old.PAY_SUC) and :new.pay_reason='MAIN' and :new.PAY_SUC='Y' then
                           begin
                                select count(1) into detailcount from order_pay_detail opd where opd.order_package_id=:new.order_package_id and opd.pay_reason='MAIN' AND PAY_SUC='Y';
                                if detailcount >=1 then
                                    begin
                                    raise_application_error(-20020, '重复插入类型为MAIN的支付明细');
                                    end;
                                end if; 
                            end;
                        end if;
                 end;
           end if;
     end;
  end if;  
  COMMIT;
end odpaydetailTrigger;
 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Oracle触发器修改自身表

    1、行级触发器不支持 update 、select 、delete 对自身表的操作。 2、表级触发器 不支持 :new 和 :old对象 所以想要触发器对自身表数据做修该,则用行级触发器得到 :new 和 :old对象中的相关数据,然后将这样的数据...

    行级触发器不能读.txt

    行级触发器不能读.txt

    Oraclet中的触发器

    2 替代触发器:由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是ORACLE 8专门为进行视图操作的一种处理方法。 3系统触发器:ORACLE 8i 提供了第三种类型的触发器叫...

    实验六-触发器实验报告.doc

    行级触发器中的谓词 在一个多条件触发的触发器中,使用谓词可以区分当前触发的操作的类型:inserting, updating,deleting。 示例: IF Inserting THEN 语句 ; END IF; IF Updating THEN 语句 ; END IF; IF Deleting...

    实验4答案-触发器.sql

    3、创建一个instead of行级触发器,为贷款表(LoanT)定义完整性规则“贷款日期(Ldata)不能早于当前日期,如果早于,自动改为当前日期”。 4、创建一个DELETE触发器,当贷款表(LoanT)中的记录被删除时,将删除的...

    trigger触发器trigger触发器trigger触发器

    --行级触发器 create or replace trigger insert_person after insert on person for each row begin insert into person2 values(:new.id,:new.name,:new.password); end; create or replace trigger update_...

    oracle触发器使用,很详细

    触发器使用教程和命名规范 1 1,触发器简介 1 2,触发器示例 2 3,触发器语法和功能 3 4,例一:行级触发器之一 4 5,例二:行级触发器之二 4 6,例三:INSTEAD OF触发器 6 7,例四:语句级触发器之一 8 8,...

    数据库-触发器

    简要介绍触发器,触发器的种类,定义,使用方法。

    实验二十五触发器

    网络数据库的触发器章节。又不太懂的同学可以下载下来研究下。

    触发器的建立使用

    发器是一种特殊的存储过程,它在执行语言事件执行时自动生效。

    触发器的总结

    描述了如何创建触发器,包括触发器的组成,触发条件,触发时机。

    oracle触发器详解

    oracle触发器详解,对初步学习数据库的人有很大的帮助

    oracle 触发器方式实现行ID自增加

    oracle 触发器方式实现行ID自增加介绍的很详细! 大家好好学习啊

    第9章_触发器.ppt

    1、了解触发器的类型及各种触发器的功能。 2、掌握各类触发器的创建方法及执行流程。 3、熟悉触发器谓词的使用。 4、重点掌握行级触发器的创建和标识符的使用 方法。

    ORACLE中查找定位表最后DML操作的时间小结

    在Oracle数据库中,如何查找,定位一张表最后一次的DML操作的时间呢? 方式有三种,不过都有一些局限性,下面简单的解析、总结一下。 1:使用ORA_ROWSCN伪列获取表最后的DML时间  ORA_ROWSCN伪列是Oracle 10g开始...

    Oracle触发器用法实例详解

    因此触发器不需要人为的去调用,也不能调用。然后,触发器的触发条件其实在你定义的时候就已经设定好了。这里面需要说明一下,触发器可以分为语句级触发器和行级触发器。详细的介绍可以参考网上的资料,简单的说就是...

    tinymce-mathjax:Tinymce MathJax插件

    TinyMCE MathJax插件 该插件使用库渲染数学字体。 该插件与TinyMCE 5和MathJax 3兼容。 安装 NPM: npm i @dimakorotkov/tinymce-mathjax --save 您可以从npm安装mathjax和tinymce npm i mathjax --save ...

    神通数据库-数据库快速入门.pdf

    在神通数据库系统中,触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效 被触发执行。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表,并 9 可以包含复杂的 ...

    oracle 触发器

    在一个表上同时定义语句级触发器和行级触发器验证先触发那种触发器的验证sql代码

    16.Oracle触发器1

    1、语句触发器DML操作(insert、delete、update),不管SQL语句影响的记录是多少行,触发器只触发一次 2、行级触发器DML操作(insert

Global site tag (gtag.js) - Google Analytics