在PL \ SQL块中使用EXECUTE IMMEDIATE

时间:2014-05-22 10:01:00

标签: sql oracle plsql ddl dml

在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。关于上面的代码,

“插入到”语句有效,但“create table”语句抛出异常,因为数据库中已存在一个具有相同名称的表。

我没有任何提交语句和代码块掉落异常并在我查看数据库时回滚我看到插入已经工作并且有一个新行。预计它不应该存在,因为没有提交和回滚工作..

如何在发生异常时进行回滚。

1 个答案:

答案 0 :(得分:3)

您可以使用此PL / SQL代码:

begin 

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:'); 

INSERT INTO Customer ( GUID, STATUS, NAME) VALUES (1,1,'xx');

EXCEPTION  -- exception handlers begin 
    WHEN OTHERS THEN  -- handles all other errors 
    DBMS_OUTPUT.PUT_LINE('Error occured, rollback...'); 

ROLLBACK;
end; 

首先它会创建表,如果发生异常,它将回滚事务并且insert语句将不起作用。希望这对你有用..