`

有关触发器 ORA-04091解决方法

 
阅读更多
最近在写触发器的时候预到了这个问题,经多方查找,得出
1.于after 类型的 for each row 级别的triggers,不论哪种insert语句触发了trigger,都不允许在 trigger 中访问本trigger所依赖的table的
2.对于before 类型的 for each row 级别的triggers,如果使用 insert into ... values 语句触发此trigger ,则在trigger 中访问本table没有问题;
但如果使用 insert into select .. from 语句触发此trigger ,则在trigger 中访问本table就报ora-04091错误;



解决方法,用oracle的自治事务

create or replace trigger twininfo_trriger
  after insert on twininfo for each row

declare
  PRAGMA AUTONOMOUS_TRANSACTION;--开启自治事务
begin
     IF INSERTING THEN

     if :new.lotno='T01012' then
     update twininfo set info='100_234100_100,1_1_1300;2_1_600;3_1_6500;4_1_13000;5_1_1900;6_1_19500;7_1_117000;8_1_7800;9_1_54000;10_1_9000;11_1_2600;12_1_900'
     where lotno= :new.lotno and batchcode= :new.batchcode;
     dbms_output.put_line(:new.lotno||'====='||:new.batchcode);
     commit;
      dbms_output.put_line('提交'||'=====');
     end if;
      if :new.lotno='T01001' then
     update twininfo set info='8442562400_2232960500_13276345700,1_0_0;2_37_12540700;3_61_1856200;4_133_300000;5_3439_60000;6_12371_10000;7_153408_1000;8_1830877_500;11_0_0;12_8_7524400;13_16_1113700;14_33_150000;15_1021_30000;16_3624_5000;17_46687_500;18_10312_6000'
        where lotno= :new.lotno and batchcode= :new.batchcode;
       commit;
     end if;
 END IF;

 end;


其实最简单应该是:

 create or replace trigger twininfo_trriger
  before insert on twininfo for each row


begin
     IF INSERTING THEN

     if :new.lotno='T01012' then
  

      :new.info :='100_234100_100,1_1_1300;2_1_600;3_1_6500;4_1_13000;5_1_1900;6_1_19500;7_1_117000;8_1_7800;9_1_54000;10_1_9000;11_1_2600;12_1_900';
     end if;
     if :new.lotno='T01001' then
     :new.info :='8442562400_2232960500_13276345700,1_0_0;2_37_12540700;3_61_1856200;4_133_300000;5_3439_60000;6_12371_10000;7_153408_1000;8_1830877_500;11_0_0;12_8_7524400;13_16_1113700;14_33_150000;15_1021_30000;16_3624_5000;17_46687_500;18_10312_6000';
 
    end if;
 END IF;

 end;


别人的例子:
create or replace trigger TR_U_ID_SYNCH
  before update on COMPANY referencing old as old_value
    new as new_value
  for each row
declare
tId  company.id%type;
PRAGMA AUTONOMOUS_TRANSACTION;
begin
if :new_value.U_ID is not null and :new_value.U_ID!=ld_value.U_ID  then
   select t.t_id into tId from company t where t.id= :new_value.U_ID;
   :new_value.P_ID :=:new_value.U_ID;
   :new_value.T_ID :=tId;
end if;
COMMIT;
end TR_CO_GB_ID_SYNCH;

分享到:
评论

相关推荐

    ORACLE8I数据库应用EXP工具时ORA-06553报错的解决方法.pdf

    ORACLE8I数据库应用EXP工具时ORA-06553报错的解决方法 摘要:本文主要解决ORACLE 8I数据库应用EXP工具时ORA-06553报错的问题,分析出现问题的原因,并提供了正确的解决方法和措施。 知识点1:Oracle 8I数据库EXP...

    Drop goldengate用户时报ORA-00604 ORA-20782 ORA-06512问题解决

    ### 解决Drop Goldengate 用户时报ORA-00604 ORA-20782 ORA-06512问题 #### 一、问题背景与现象 在进行Oracle数据库管理过程中,经常会遇到需要删除用户的场景。当尝试执行`drop user goldengate cascade;`命令时,...

    Oracle 授权 ORA-00990: 权限缺失或无效

    在Oracle数据库管理中,"ORA-...通过理解和掌握这些知识点,您可以有效地解决“ORA-00990: 权限缺失或无效”的问题,并更好地管理Oracle数据库中的权限分配。记住,权限管理是数据库安全的重要组成部分,必须谨慎处理。

    Oracle 回收站功能,彻底删除表ORA-00933:SQL command not properly ended

    解决方法是确保SQL语句完整无误,并使用正确的语法进行删除操作。 #### 四、总结 Oracle的回收站功能为用户提供了一个方便的方式来管理数据库对象的删除与恢复,极大地降低了误删带来的风险。然而,有时候也需要...

    plsql不能连接linux下oracle问题ORA-12514.doc

    PL/SQL无法连接Linux下Oracle问题ORA-12514解决方案 PL/SQL作为Oracle的过程语言,能够在Oracle数据库...通过修改 listener.ora 文件和启动相关数据库和监听服务,可以解决这个问题,使PL/SQL能够连接到Oracle数据库。

    Oracle 数据库常见问题诊断方法

    ##### 1.7 ORA-04091 - **特征**: - 触发器工作异常。 - **原因**: - 当触发器试图读取或修改正在被修改或插入的数据时可能会发生此错误。 - **措施**: - 检查触发器脚本,确保其引用的完整性。 ##### 1.8 ...

    Oracle数据库表定时备份表 表名动态拼接时间戳存储过程-解决了ORA-00922

    1、备份Oracle数据库表时添加动态时间戳,解决了ORA-00922: missing or invalid option 错误和ORA-00922: 选项缺失或无效错误。 2、备份表结构和数据,还备份索引、序列、触发器等对象,提高了备份速度。但需要手动...

    Oracle12c启动问题解决说明

    ORA-00119错误是指系统参数LOCAL_LISTENER的设置无效,而ORA-00132错误是指语法错误或未解决的网络名'LISTENER_ORCL'。 二、解决方法 Oracle12c/oracle11g和oracle10g有一些区别,主要体现在spfile的位置不同。...

    数据库坏块(ORA-01578)的解决方法.pdf

    这可以通过创建一个触发器来实现,当特定的错误发生时,触发器将记录相关信息,帮助定位问题的根源。具体操作步骤包括编写和启用触发器,然后重新执行导致错误的操作,以便捕获错误信息。 2. **ROW ID检测法**: ...

    oracle 错误代码一览表

    * ORA-05000 到 ORA-05999: 触发器错误 * ORA-06000 到 ORA-06999: 索引错误 * ORA-07000 到 ORA-07999:视图错误 * ORA-08000 到 ORA-08999: 序列错误 * ORA-09000 到 ORA-09999: 同义词错误 Oracle 错误代码是一种...

    ORACLE 11G导入到10G的命令

    在实际操作过程中还需要根据具体情况调整参数,并且密切关注日志文件中的信息,以便及时发现并解决问题。此外,建议在正式迁移之前先在一个测试环境中进行模拟操作,确保一切正常后再应用于生产环境。

    Oracle常见错误诊断

    Oracle数据库在运行过程中可能会遇到各种错误,这些错误通常以特定的错误代码表示,如ORA-12571、ORA-01000、ORA-01545、ORA-0165x、ORA-01555、ORA-04031、ORA-04091、ORA-01242和ORA-01113。这些错误涉及数据库...

    oracle错误一览表

    9. **触发器和约束**:ORA-02091(触发器执行时出错)和ORA-02291(违反外键约束)等错误,可能与数据库的完整性约束有关。 10. **性能优化**:错误如ORA-01555(快照过旧)可能暗示需要优化查询或调整缓存设置以...

    SHOUG文档分享-ORACLE-TTS迁移后ORA3113错误处理-SHOUG成员左翼

    要解决此问题,我们需深入了解其背后的异常,如ORA-07445,并对数据库的迁移以及表结构进行分析。 首先,案例描述了数据库从Oracle 9i迁移到IBM小型机上的Oracle 11g环境。迁移是数据库维护和升级的重要环节,它...

    oracle报错

    1. **错误消息**:Oracle会提供详细的错误信息,包括错误代码(如ORA-00001)、错误描述以及可能的解决方案。 2. **环境检查**:确认操作系统、数据库版本、网络设置是否正常,是否存在更新或补丁问题。 3. **SQL...

    oracle ORA-00988 missing or invalid password 错误

    在开发和运维过程中,了解如何使用这些工具和语言,以及如何解决常见的Oracle错误,如"ORA-00988",都是提升工作效率的关键。例如,当你需要合并多行记录时,可以使用Oracle的WM_CONCAT函数,或者在Oracle 11g及以上...

    oracle很详细的讲解1431page.rar

    再者,Oracle数据库还提供了高级特性,如分区、物质化视图、物化 join 表、存储过程、触发器等,这些特性可以帮助解决大数据量、复杂业务场景下的问题。文档可能详细解析了如何利用这些特性来设计高效、稳定的数据库...

    利用 Oracle 系统触发器防止误删除表操作

    #### 解决方案:使用Oracle系统触发器 为了应对这类问题,可以通过创建Oracle系统触发器来实现对`DROP TABLE`和`TRUNCATE TABLE`命令的监控与阻止。以下详细介绍两种不同的Oracle版本(10g和8i)下如何创建相应的...

    Oracle Error 全集

    1. **识别错误**:当遇到ORA-错误时,首先记录错误代码和相关的错误消息,这将是我们解决问题的起点。 2. **理解错误**:查阅官方文档如Oracle Database Error Messages或者在线资源,如Oracle Support(My Oracle ...

    oracle坏块处理

    本文将详细解析ORA-01578错误的成因、诊断方法及修复流程,旨在为初学者和经验不足的DBA提供全面的指导。 #### 错误情景与成因分析 ORA-01578错误的发生,往往在执行特定查询或操作时被触发,如案例中描述的对`tg_...

Global site tag (gtag.js) - Google Analytics