使用 SqlPlus 执行 Oracle 脚本;如果有任何异常,在脚本处理之前进入状态

Posted

技术标签:

【中文标题】使用 SqlPlus 执行 Oracle 脚本;如果有任何异常,在脚本处理之前进入状态【英文标题】:Execute Oracle script with SqlPlus; go to state before script processing if any exceptions 【发布时间】:2020-01-10 06:45:10 【问题描述】:

我有很多包含各种事务的脚本,包括复杂的 DML 和 DDL。

我需要找到一种方法来完全运行它们或根本不运行它们。我希望看到以下行为:如果在脚本处理过程中发生任何错误 => 回到脚本处理之前的状态。

我以为我只是将整个脚本放入一个大事务中,在开头放置一个 savepoint 并在出现任何异常时回滚到保存点,但 AFAIK 这是不可能的,就像 Oracle 所做的那样不支持嵌套事务。

您介意分享您对该案例的看法吗?

【问题讨论】:

【参考方案1】:

我认为这没有简单的解决方案,因为您的脚本中有 DDL。 DDL 在处理之前会执行commit,所以rollback 将无济于事。

作为替代方案,您可以使用 Oracle 的闪回选项。但这会影响整个数据库。您创建一个flashback restore point,运行脚本,如果发生任何错误,则将数据库闪回到还原点。这将恢复数据库所有模式中的所有更改。当您有单独的数据库来运行/测试脚本时,这很好。它相当快。数据库应处于归档日志模式。

另一种选择是使用导出/导入实用程序 (expdp/impdp)。这也很难在一个脚本中实现自动化,因此您需要手动进行恢复。您获取导出转储,运行脚本,如果发生任何错误 - 您恢复运行 impdp 的数据库模式的转储。

【讨论】:

【参考方案2】:

也许您需要的是“whenever sqlerror exit”子句。 检查它here out

【讨论】:

感谢您的回答,但这让我的脚本没有完全执行,也没有回滚到初始状态。 无论何时 SQLERROR EXIT ROLLBACK -- 会有帮助吗?

以上是关于使用 SqlPlus 执行 Oracle 脚本;如果有任何异常,在脚本处理之前进入状态的主要内容,如果未能解决你的问题,请参考以下文章

怎么样用shell做一个连接oracle数据库的脚本?

oracle sqlplus login.sql设置

cmd 执行sql脚本,该怎么处理

oracle sqlplus命令汇总

Oracle数据库的sqlplus可以直接执行SQL语句吗?

oracle 的sql*plus问题