`

行级触发器对当前表操作,”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;
 

 

 

 

 

 

 

分享到:
评论

相关推荐

    ORA-00060: 等待资源时检测到死锁--oracle 数据库表死锁异常

    在Oracle数据库系统中,"ORA-00060: 等待资源时检测到死锁" 是一个常见的错误提示,它表明两个或多个事务在执行过程中陷入了无法继续进行的状态,因为彼此都在等待对方释放资源。这种情况通常发生在并发操作中,比如...

    行级触发器不能读.txt

    文档中提到“行级触发器不能读.txt”,这可能是想表达行级触发器在某些情况下无法直接访问被修改前的数据。在Oracle数据库中,行级触发器可以使用`:OLD`和`:NEW`伪记录来引用被修改前后的数据。然而,在某些特殊场景...

    Oracle触发器修改自身表

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

    Oracle错误代码大全

    - **描述**:另一个进程设置了一个与当前操作不兼容的DML_LOCKS值。 - **解决方法**:确保所有相关进程使用一致的DML_LOCKS值。 #### ORA-00062: 无法获得DML全表锁定;DML_LOCKS为0 - **描述**:无法获取DML全表...

    Oracle触发器与存储过程高级编程-第3版itpub.rar

    《Oracle触发器与存储过程...通过对这本书的深入学习,读者不仅能掌握Oracle触发器和存储过程的基本概念,还能提升在实际项目中运用这些技术解决复杂问题的能力。无论是数据库管理员还是开发人员,都将从中受益匪浅。

    oracle触发器实例

    Oracle触发器是数据库管理系统Oracle中的一个重要特性,它允许开发者在特定的数据操作语言(DML)事件发生时自动执行预定义的PL/SQL代码。触发器主要用于实现数据的完整性、一致性控制,以及执行复杂的业务规则。...

    oracle错误提示解释

    #### ORA-00085: 当前操作已取消 **错误描述**:当前正在进行的操作被人为中断或取消。 **解决方案**: - 了解取消操作的原因。 - 根据需要重新执行该操作。 #### ORA-00099: 等待全表扫描锁定(PDML)时超时 **...

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

    然后创建了一个行级触发器,当Account表的balance字段发生变化时,同步更新Customer表的Savings字段。这样确保了Account表和Customer表之间的数据一致性。 在后续的实验步骤中,去除了外键约束以允许特定的操作,...

    oracle 数据库 触发器

    Oracle 数据库触发器是数据库管理系统中的一个重要特性,用于在特定事件发生时自动执行预定义的SQL语句或PL/SQL代码块。Oracle 9i版本引入了多种类型的触发器,这些触发器允许开发者实现复杂的业务逻辑和数据完整性...

    实验二十五触发器

    当对关联表进行特定数据操作时,它们会自动激活。触发器的主要功能是扩展SQL语言的功能,允许在数据库级别实现复杂的业务规则和约束,这些规则和约束无法仅通过简单的INSERT、UPDATE和DELETE语句实现。 **2. 触发器...

    oracle ora-00054:resource busy and acquire with nowait specified解决方法

    总之,`ORA-00054`错误是并发环境下常见的问题,解决它需要理解Oracle的锁定机制,并通过查询数据库状态、分析SQL和终止会话等方法来恢复系统的正常运行。在日常运维中,预防此类问题的发生同样重要,这需要合理的...

    oracle触发器的设计.pdf

    Oracle触发器是数据库管理系统中的一种特殊类型的存储过程,主要用于在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行一系列数据库操作。触发器的设计和实现对于数据库的业务规则和完整性约束有着重要...

    关于oracle触发器before和after的应用问题

    - **替代触发器**:专门设计用于视图操作,解决了直接对多表视图进行修改时的局限性。替代触发器会在试图对视图进行DML操作时激活,从而实现底层表的间接更新。 #### 系统触发器 系统触发器是一种特殊类型,可在...

    精通Oracle核心技术和项目实战之触发器.

    - **级联更新**:当一个表中的数据发生变化时,自动更新相关表中的关联数据。 - **审计追踪**:记录表上的操作,便于后续的审计工作。 - **数据同步**:实现不同数据库节点之间的数据同步更新。 - **日志记录**:...

    实验4答案-触发器.sql

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

    数据库触发器学习资料

    SQL触发器的概念源自关系数据库理论,用于实现复杂的数据完整性约束,或者在数据发生变化时自动执行某些操作。本学习资料主要针对想要深入理解和掌握SQL触发器的读者,对数据库管理和开发人员尤其有价值。 一、...

    触发器和权限管理PPT学习教案.pptx

    触发器是数据库管理系统中的一个重要工具,用于在特定数据操作(如INSERT, UPDATE, DELETE)前后自动执行指定的SQL语句或PL/SQL代码块,而权限管理则涉及到如何控制用户对数据库资源的访问。 1. **触发器的创建语法...

    oracle触发器详解

    Oracle触发器是数据库管理系统中的一种重要机制,它允许在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行一段预定义的SQL代码或PL/SQL块。这对于实现业务规则、数据验证、日志记录等场景非常有用。...

    oracleDML触发器1.ppt

    Oracle DML触发器是数据库管理系统Oracle中的一种特性,它允许开发者在特定的数据操作语言(DML)事件(如INSERT、UPDATE、DELETE)发生时自动执行一段PL/SQL代码。DML触发器主要用于实现数据完整性、业务规则的强制...

Global site tag (gtag.js) - Google Analytics