退出Oracle SQL*Plus中的会话后回滚

退出Oracle SQL*Plus中的会话后回滚,oracle,sqlplus,oracle19c,Oracle,Sqlplus,Oracle19c,我正在编写一个包装器shell或perl脚本,它使用sqlplus打开oracle会话,然后通过扫描目录执行一些sql文件。作为其中的一部分,假设我们在一个目录中有多个sql文件, 例如:first.sql,second.sql,third.sql 我计划创建一个包含以下内容的文件(AllSqlFilesInDirectory.sql) >cat AllSqlFilesInDirectory.sql @first.sql @second.sql @third.sql > 现在,我计

我正在编写一个包装器shell或perl脚本,它使用sqlplus打开oracle会话,然后通过扫描目录执行一些sql文件。作为其中的一部分,假设我们在一个目录中有多个sql文件, 例如:first.sql,second.sql,third.sql 我计划创建一个包含以下内容的文件(
AllSqlFilesInDirectory.sql

>cat AllSqlFilesInDirectory.sql
@first.sql
@second.sql
@third.sql
>
现在,我计划通过打开oracle sqlplus会话来运行文件AllSqlFilesInDirectory.sql。 执行后,我计划退出oracle sqlplus会话,并计划搜索日志文件中的任何错误。 如果有任何错误,我想执行回滚。但我认为,由于我退出了sqlplus会话,回滚是不可能的。我只关心作为目录中多个sql文件的一部分执行的DML语句。 所以我有这些疑问

  • 我可以简单地忽略并根本不关心回滚吗
  • 我可以为已关闭的会话执行回滚吗
  • 如果以上是有效的,那么怎么做呢
  • 我可以简单地忽略并根本不关心回滚吗
  • 这是一个你必须回答的商业问题。如果希望在出现错误时回滚更改,则需要执行回滚

  • 我可以为已关闭的会话执行回滚吗
  • 实际上,可能不是。从技术上讲,您可以使用,但这通常是您通常希望处理的更复杂的方式

  • 如果以上是有效的,那么怎么做呢
  • 与写入日志文件并解析日志文件以确定是否存在任何错误相比,简单地放置

    whenever sqlerror exit rollback
    
    在脚本的顶部。这告诉SQL*Plus回滚事务并在遇到错误时退出。您不必编写逻辑来解析日志文件

  • 我可以简单地忽略并根本不关心回滚吗
  • 这是一个你必须回答的商业问题。如果希望在出现错误时回滚更改,则需要执行回滚

  • 我可以为已关闭的会话执行回滚吗
  • 实际上,可能不是。从技术上讲,您可以使用,但这通常是您通常希望处理的更复杂的方式

  • 如果以上是有效的,那么怎么做呢
  • 与写入日志文件并解析日志文件以确定是否存在任何错误相比,简单地放置

    whenever sqlerror exit rollback
    
    在脚本的顶部。这告诉SQL*Plus回滚事务并在遇到错误时退出。您不必编写逻辑来解析日志文件


    如果中间有一些DDL,则将提交所有挂起的DML。因此,闪回更适合此类任务(并保持数据库处于一致状态)。明白。但如果我们忽略处理DDL,这将是一个问题。所以所有DDL语句都应该包装在一个自治事务中。@Vijay-这个过程到底在做什么?如果您是唯一使用数据库的人,因为您正在升级一个大型应用程序,那么您可以在脚本启动之前设置一个保证还原点,然后在发生故障时还原到该点。@JustinCave,此过程只是一个包装器,用于对数据库表执行任何数据修复。此过程主要希望记录此类数据修复的每个活动。如果中间有一些DDL,则将提交所有挂起的DML。因此,闪回更适合此类任务(并保持数据库处于一致状态)。明白。但如果我们忽略处理DDL,这将是一个问题。所以所有DDL语句都应该包装在一个自治事务中。@Vijay-这个过程到底在做什么?如果您是唯一使用数据库的人,因为您正在升级一个大型应用程序,那么您可以在脚本启动之前设置一个保证还原点,然后在发生故障时还原到该点。@JustinCave,此过程只是一个包装器,用于对数据库表执行任何数据修复。此过程主要是记录此类数据修复的每个活动。看起来像是SQL*Plus问题而不是PL/SQL问题。看起来像是SQL*Plus问题而不是PL/SQL问题。