zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    分享一个详情页
    ES6初探,变量的声明
    ES6初探,什么是ES6
    提问回顾
    个人阅读&个人总结
    结对项目-数独程序扩展
    个人作业Week3-案例分析
    个人作业Week2-代码复审
    个人作业1
    【个人项目】数独
  • 原文地址:https://www.cnblogs.com/hfliyi/p/5782405.html
Copyright © 2011-2022 走看看