• 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

  • 相关阅读:
    jQuery小案例
    update-alternatives
    计算机网络备忘
    报文交换 (转自百度百科,方便以后复习)
    erlang supervisor simple_one_for_one实例
    erlang supervisor中启动普通的进程
    erlang四大behaviour之一gen_server(转载)
    用Doxygen+Graphviz生成函数调用流程图(转)
    selenium模块
    request模块
  • 原文地址:https://www.cnblogs.com/hfliyi/p/5782405.html
Copyright © 2020-2023  润新知