[英]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.