Oracle

在 PLSQL 塊中使用 EXECUTE IMMEDIATE

  • May 22, 2014

在 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”的布爾值,然後呼叫過程將獲得關於是否創建表的真/假響應。然後,您將能夠送出或回滾您的插入。

引用自:https://dba.stackexchange.com/questions/65667