Oracle SQL*Plus 中的 session 出来后回滚

Rollback after coming out of the session in Oracle SQL*Plus

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

>cat AllSqlFilesInDirectory.sql
@first.sql
@second.sql
@third.sql
>

现在我打算通过打开 oracle sqlplus session 来 运行 文件 AllSqlFilesInDirectory.sql。 执行后,我打算从oracle sqlplus session 中出来,我打算在日志文件中搜索任何错误。 如果有任何错误,我想执行回滚。但我认为,因为我不在 sqlplus session 范围内,所以回滚是不可能的。我只关心作为目录中多个 sql 文件的一部分执行的 DML 语句。 所以我有这些疑惑

  1. 我可以简单地忽略而不关心回滚吗
  2. 我可以为已经关闭的 session 执行回滚吗?
  3. 如果以上都成立,那怎么办呢?
  1. Can I simply ignore and not be concerned about rollback at all

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

  1. Can I do the rollback for a session which was already closed?

实际上,可能不会。从技术上讲,您可以使用 flashback transaction backout,但这通常比您通常想要处理的复杂得多。

  1. If above is valid, then how can do it?

与其写入日志文件并解析日志文件以确定是否存在任何错误,更简单的做法是简单地输入一个

whenever sqlerror exit rollback

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

Whenever sqlerror documentation