oracle11g – Oracle 11 – sqlplus – 回滚整个脚本的错误 – 怎么样?

前端之家收集整理的这篇文章主要介绍了oracle11g – Oracle 11 – sqlplus – 回滚整个脚本的错误 – 怎么样?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何在包含的sql文件中的任何错误上使Oracle 11g回滚整个事务?

文件内容是:

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:

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

解决方法

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

猜你在找的Oracle相关文章