Oracle 11 - sqlplus - 回滚整个脚本的错误 - 如何?

时间:2013-02-08 09:19:54

标签: oracle11g sqlplus rollback

如何让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:

  1. 在出错时停止处理文件,
  2. 并在出错时回滚整个交易?

2 个答案:

答案 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;
/