在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。关于上面的代码,
“插入到”语句有效,但是“创建表”语句引发异常,因为数据库中已经存在一个具有相同名称的表。
当我查看数据库时,我都没有任何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;
因此,首先它将创建表,如果发生异常,它将回滚事务,并且insert语句将不起作用。希望这对您有用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句