2017-03-07 60 views
-1

我想建立一個存儲過程: 1.截斷表A 2.截斷表B表中列A 4.刀片 3.插入物(批次)(大量)的行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; 
+2

TRUNCATE執行一個隱含的承諾,並且不能在最回滾案例(閃回)。 –

回答

5

在Oracle,截斷表是不能在一個事務中使用(或,更準確地,不能被回滾)。如果執行該語句時,有進行中的交易,交易DDL語句被提交,然後TRUNCATE被執行並且不能被撤消。

嘗試DELETE FROM 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; 
+0

好的,謝謝。那麼,如果我這樣做:'創建或替換PROCEDURE作爲 BEGIN 從MAIN.SET刪除; 插入MAIN.SET select * from MAIN.SET_STAG; 從MAIN.TYPE刪除; 插入MAIN.TYPE select * from MAIN.TYPE_STAG; COMMIT; EXCEPTION當其他人 ROLLBACK; RAISE; END;' – mpdegn

+0

很酷,會試試你的代碼。謝謝!!! – mpdegn