oracle回退脚本怎么写,Oracle 11-sqlplus-发生错误时回滚整个脚本-怎么样?

How can I make Oracle 11g rollback the whole transaction on any error in included SQL file?

The file contents are:

set autocommit off

whenever SQLERROR EXIT ROLLBACK

insert into a values (1);

insert into a values (2);

drop index PK_NOT_EXIST;

commit;

And the file is included into sqlplus session using "@":

@error.sql

As expected, the sqlplus session terminates and the output is

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

But when I re-launch sqlplus then the table a contains 2 records which means that there was a commit and not a rollback on exit of sqlplus.

Can I somehow force sqlplus to:

stop processing file on error,

and rollback the whole transaction on error?

解决方案

DDL performs a commit before it runs and after so that even if your DDL fails, oracle will have already committed the transaction.

you could work around it with:

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;

/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值