在 PL\SQL block 中使用 EXECUTE IMMEDIATE 使整个 block 立即提交。
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。关于上面的代码,
“插入到”语句有效,但“创建表”语句抛出异常,因为数据库中已经存在同名表。
当我查看数据库时,我没有任何提交语句和代码块发生异常并回滚,我看到插入已经工作并且有一个新行。预计它不应该在那里,因为没有提交并且回滚也有效..
异常发生时如何回滚
最佳答案
您可以键入此 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;
所以首先它会创建表,如果发生异常它会回滚事务并且插入语句将不起作用。希望这对你有用..
关于sql - 在 PL\SQL block 中使用 EXECUTE IMMEDIATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23803601/