繁体   English   中英

存储过程:仅在成功时提交

[英]Stored Procedure: only commit when successful

我想建立一个存储过程:1.截断表A 2.截断表B 3.在表A中插入(很多)行4.在表B中插入(很多)行

存储过程应仅在步骤4之后提交语句,以使表不会被锁定并且不会停机。 如果发生错误(例如在第4步中),则必须回滚所有更改。 我尝试自己编写它,但在每次声明后都将其提交。

create or replace PROCEDURE upall as

BEGIN
  execute immediate 'truncate table MAIN.SET';
  insert into MAIN.SET select * from MAIN.SET_STAG;

  execute immediate 'truncate table MAIN.TYPE';
  insert into MAIN.TYPE select * from MAIN.TYPE_STAG;

  COMMIT; 
EXCEPTION WHEN OTHERS THEN
  ROLLBACK;
  RAISE; 
END;

在Oracle中,TRUNCATE TABLE是不能在事务中使用的DDL语句(或更准确地说,不能回滚)。如果执行该语句时有事务正在执行,则提交该事务,然后TRUNCATE被执行已执行,无法撤消。

尝试从YourTable中删除,并最终更新表的统计信息(因为DELETE将过时)

它看起来像:

CREATE or REPLACE PROCEDURE upall as

BEGIN
    delete from MAIN.SET;
    insert into MAIN.SET select * from MAIN.SET_STAG;

    delete from MAIN.TYPE;
    insert into MAIN.TYPE select * from MAIN.TYPE_STAG;

    COMMIT; 

    EXEC DBMS_STATS.GATHER_TABLE_STATS ('MAIN', 'SET');
    EXEC DBMS_STATS.GATHER_TABLE_STATS ('MAIN', 'TYPE');

    EXCEPTION WHEN OTHERS THEN
    ROLLBACK;
    RAISE; 
END;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM