• Oracle 中触发器增加存储过程commit问题


    触发器无需commit
    也不能写commit
    触发器和触发它的DML是同一个事务
    DML提交了,触发器的操作也提交了,要不就一起回滚了

    当然,如果你一定要在触发器里写COMMIT
    那就用自治事务
    相当于一个事务里的子事务

    正常情况下,Oracle规定在触发器中不能运行 ddl语句和commit,rollback语句。

    解决办法有两种:

    1.在可以在触发器中加入:pragma autonomous_transaction; 表示自由事务处理。
    如:

    create or replace trigger UPDATE_relaction_SAMPLE
    before update ON SAMPLE
    REFERENCING
    FOR EACH ROW

    DECLARE
    pragma autonomous_transaction;
    verror int;
    BEGIN
    verror:=0;
    update sample_relation t set t.status=:new.status where t.sample_id=:new.trim_idnumeric;
    if :new.status='C' and :old.status<>'C' then
    proc_synch_procedure_data(:new.trim_idnumeric,verror);

    end if;
    commit;
    END UPDATE_relaction_SAMPLE;

    2.可以另外写一个方法,把dll语句传递到这个方法中去执行。

    注释:
       ddl语句:DDL语句用语定义和管理数据库中的对象,如Create,Alter,Drop,truncate等;DDL操作是隐性提交的!操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger
       DML(Data Manipulation Language)数据操纵语言命令使用户能够查询数据库以及操作已有数据库中的数据。如insert,delete,update,select等都是DML

  • 相关阅读:
    第一次开发分享的经验教训
    开发人员的 Linux 命令学习清单
    代码质量基本准则
    职业发展思考(二)
    软件调试的基本技巧
    多数据源的动态配置与加载使用兼框架交互的问题调试
    对象与并发:概述
    编程模式: 回调
    创新式开发探索(一) —— 开篇
    Linux 命令学习示例: tr
  • 原文地址:https://www.cnblogs.com/xibuhaohao/p/11769521.html
Copyright © 2020-2023  润新知