在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”语句抛出异常,因为数据库中已存在一个具有相同名称的表。
我没有任何提交语句和代码块掉落异常并在我查看数据库时回滚我看到插入已经工作并且有一个新行。预计它不应该存在,因为没有提交和回滚工作..
如何在发生异常时进行回滚。
答案 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语句将不起作用。希望这对你有用..