2016-03-15 197 views
0

我被這樣一個接一個執行腳本中的幾個SQL文件:Oracle。如何實現嵌套事務

@script-A.sql; 
@script-B.sql; 
@script-C.sql; 
... 

每個腳本文件做一些有用的,看起來像這樣:

DECLARE 
... 
BEGIN 

    EXECUTE IMMEDIATE 'TRUNCATE SOME-TABLE'; 
    -- lots of inserts into SOME_TABLE 
    COMMIT; 
END; 
/

我必須在一個大事務中包裝sql文件執行。如果執行任何sql文件失敗,則應該回滾所有先前的sql文件更改。

我該怎麼做?

P.S

作爲@Mat注意到DDL變化(截斷表)不能rollbacked。如果需要的話,我可以自由地重構這行代碼。

+3

不能回滾DDL(截斷是DDL),所以... – Mat

+0

@Mat將事情改變,如果我重構「截斷」到「從刪除」? – user149691

+0

是的,刪除是DML,你可以從它回滾。 – sagi

回答

1

在這裏,你可以用它來控制事務是 保持異常每個腳本,使內部處理的最佳方式如果有任何交易失敗,整個更改將被恢復。這裏唯一的 的條件是保持COMMIT在最後,以便在 成功的交易中最後一次滅火COMMIT。希望下面的代碼 幫助。

------------------------------Script 1----------------------------------------- 


--Simple query to delete from records 
DECLARE 
    p_err_cd PLS_INTEGER; 
    p_err_msg VARCHAR2(100 CHAR); 
BEGIN 
-- EXECUTE IMMEDIATE 'DELETE EMP '; 
    INSERT INTO EMP 
    SELECT '123', 'AVRJIT', 'DB', 12, SYSDATE, 1200, 123, 10, '123' FROM DUAL; 
EXCEPTION 
WHEN OTHERS THEN 
ROLLBACK; 
    p_err_cd := SQLCODE; 
    p_err_msg:=SQLERRM; 
dbms_output.put_line('Transaction Rollback'); 
END; 
/

---------------------------------Script 2 ---------------------------------- 
--Simple query to delete from records 
DECLARE 
    p_err_cd PLS_INTEGER; 
    p_err_msg VARCHAR2(100 CHAR); 
BEGIN 
-- EXECUTE IMMEDIATE 'DELETE EMP '; 
    INSERT INTO EMP 
    SELECT '123A', 'AVRJIT', 'DB', 12, SYSDATE, 1200, 123, 10, '123' FROM DUAL; 
EXCEPTION 
WHEN OTHERS THEN 
ROLLBACK; 
    p_err_cd := SQLCODE; 
    p_err_msg:=SQLERRM; 
dbms_output.put_line('Transaction Rollback'); 
END; 
/
----------------------------------------------------------------------------- 
Since EMP table has EMPNO as NUMBER field so the second script will fail. 
While running the main executing file i.e Full_script.sql 


set serveroutput on; 
@C:\Av_test_script\Stack_overflow\full_script.sql 


PL/SQL procedure successfully completed. 

PL/SQL procedure successfully completed. --> Failed as EMPNO column here is of Invalid datatype 

Transaction Rollback