如何让Oracle 11g在包含的SQL文件中的任何错误上回滚整个事务?
文件内容为:
set autocommit off
whenever SQLERROR EXIT ROLLBACK
insert into a values (1);
insert into a values (2);
drop index PK_NOT_EXIST;
commit;
使用“@”将文件包含在sqlplus会话中:
@error.sql
正如预期的那样,sqlplus会话终止,输出为
SQL> @error.sql
1 row created.
1 row created.
drop index PK_NOT_EXIST *
ERROR at line 1:
ORA-01418: specified index does not exist
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
但是当我重新启动sqlplus时,表a包含2条记录,这意味着有一个提交,而不是退出sqlplus时的回滚。
我可以以某种方式强制sqlplus:
答案 0 :(得分:2)
我解决了这个问题,如果有人遇到这样的问题,我会回复解决方案。
如果我没有在脚本中放置DDL命令,则正确执行回滚。
所以脚本:
set autocommit off
whenever SQLERROR EXIT ROLLBACK
insert into a values (1);
insert into a values (2);
insert into a values ('x');
commit;
的工作原理。
如果使用DDL,那么通常Oracle不提供回滚功能。
答案 1 :(得分:2)
DDL在运行之前和之后执行提交,这样即使您的DDL失败,oracle也已经提交了事务。
你可以解决这个问题:
set autocommit off
whenever SQLERROR EXIT ROLLBACK
declare
procedure drop_idx(i varchar2)
is
pragma autonomous_transaction; -- this runs in its own transaction.
begin
execute immediate 'drop index ' || i;
end;
begin
insert into a values (1);
insert into a values (2);
drop_idx('PK_NOT_EXIST');
end;
/