使用 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 脚本;如果有任何异常,在脚本处理之前进入状态的主要内容,如果未能解决你的问题,请参考以下文章