首页 > 解决方案 > 在 Oracle SQL*Plus 中退出会话后回滚

问题描述

我正在编写一个包装器 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 语句。所以我有这些疑问

  1. 我可以简单地忽略并且根本不关心回滚吗
  2. 我可以回滚已经关闭的会话吗?
  3. 如果上面是有效的,那么怎么做呢?

标签: oraclesqlplusoracle19c

解决方案


  1. 我可以简单地忽略并且根本不关心回滚吗

这是您必须回答的商业问题。如果您希望在出现错误时回滚更改,则需要进行回滚。

  1. 我可以回滚已经关闭的会话吗?

实际上,可能不会。从技术上讲,您可以使用闪回事务回退,但这通常比您通常想要处理的更复杂。

  1. 如果上面是有效的,那么怎么做呢?

与其写入日志文件并解析日志文件以确定是否有任何错误,不如简单地放置一个

whenever sqlerror exit rollback

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

Whenever sqlerror文件


推荐阅读