在PL\SQL块中使用EXECUTE IMMEDIATE
在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
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
会提交。