在PL\SQL块中使用EXECUTE IMMEDIATE

在PL\SQL块中使用EXECUTE IMMEDIATE,sql,oracle,plsql,ddl,dml,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 NOCO

在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。关于上述代码

“Insert into”语句起作用,但“create table”语句引发异常,因为数据库中已有同名的表

我没有任何commit语句,当我查看数据库时,代码块出现异常并回滚,我看到insert已经工作,并且有一个新行。它本来不应该在那里,因为没有提交,也没有回滚


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

您可以使用以下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语句将不起作用。希望这对您有用。

这是因为DDL在Oracle中不是事务性的。请参阅:
executeimmediate
不会提交,但您的
CREATE TABLE
会提交。