Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SqlPlus执行Oracle脚本;如果出现任何异常,请转到脚本处理前的状态_Oracle_Sqlplus - Fatal编程技术网

使用SqlPlus执行Oracle脚本;如果出现任何异常,请转到脚本处理前的状态

使用SqlPlus执行Oracle脚本;如果出现任何异常,请转到脚本处理前的状态,oracle,sqlplus,Oracle,Sqlplus,我有很多包含各种事务的脚本,包括复杂的DML和DDL 我需要找到一种方法来完全运行它们,或者根本不运行。我想看看下面的行为:如果脚本处理中间出现错误,则回到脚本处理之前的状态。 我认为我应该将整个脚本放在一个大事务中,在开始时放置一个保存点,并在出现任何异常时回滚到保存点,但这是不可能的,因为Oracle不支持嵌套事务 您介意分享您对该案例的想法吗?也许您需要的是where-sqlerror-exit子句。 检查一下我认为没有一个简单的解决方案,因为您的脚本中有DDL。DDL在处理之前执行com

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

我需要找到一种方法来完全运行它们,或者根本不运行。我想看看下面的行为:如果脚本处理中间出现错误,则回到脚本处理之前的状态。 我认为我应该将整个脚本放在一个大事务中,在开始时放置一个保存点,并在出现任何异常时回滚到保存点,但这是不可能的,因为Oracle不支持嵌套事务


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

也许您需要的是where-sqlerror-exit子句。
检查一下

我认为没有一个简单的解决方案,因为您的脚本中有DDL。DDL在处理之前执行commit,所以回滚没有帮助

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


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

谢谢您的回答,但这会给我留下一个未完全执行、未回滚到初始状态的脚本。每当SQLERROR退出回滚时,这会有帮助吗?