Oracle
在 PLSQL 塊中使用 EXECUTE IMMEDIATE
在 PL\SQL 塊中使用 EXECUTE IMMEDIATE 會使整個塊立即送出。
begin INSERT INTO Customer ( GUID, STATUS, NAME) VALUES (1,1,'xx'); EXECUTE IMMEDIATE 'CREATE TABLE Shop ( GUID NUMBER(16), STATUS NUMBER(1), NAME VARCHAR2(50 BYTE), ) LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING'; DBMS_OUTPUT.PUT_LINE('DONE:'); EXCEPTION -- exception handlers begin WHEN OTHERS THEN -- handles all other errors DBMS_OUTPUT.PUT_LINE('Error occured, rollback...'); ROLLBACK; end;
正如您所意識到的,我什至不使用 COMMIT。關於上面的程式碼,
“插入”語句有效,但“創建表”語句會拋出異常,因為數據庫中已經存在同名表。
當我查看數據庫時,我沒有任何送出語句和程式碼塊出現異常並回滾,我看到插入已經工作並且有一個新行。預計它不應該在那裡,因為沒有送出並且回滾也有效..
發生異常時如何進行回滾。
在 Oracle 中,當您創建表或執行 alter 語句時,存在隱含的送出。您可能希望在一個單獨的函式中創建表,該函式返回一個帶有“PRAGMA AUTONOMOUS_TRANSACTION”的布爾值,然後呼叫過程將獲得關於是否創建表的真/假響應。然後,您將能夠送出或回滾您的插入。