oracle - 在 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 语句。所以我有这些疑问
- 我可以简单地忽略并且根本不关心回滚吗
- 我可以回滚已经关闭的会话吗?
- 如果上面是有效的,那么怎么做呢?
解决方案
- 我可以简单地忽略并且根本不关心回滚吗
这是您必须回答的商业问题。如果您希望在出现错误时回滚更改,则需要进行回滚。
- 我可以回滚已经关闭的会话吗?
实际上,可能不会。从技术上讲,您可以使用闪回事务回退,但这通常比您通常想要处理的更复杂。
- 如果上面是有效的,那么怎么做呢?
与其写入日志文件并解析日志文件以确定是否有任何错误,不如简单地放置一个
whenever sqlerror exit rollback
在脚本的顶部。这告诉 SQL*Plus 在遇到错误时回滚事务并退出。您不必编写逻辑来解析日志文件。
推荐阅读
- html - 如何定位两个导航栏?
- javascript - 如何在 Angular 中为按钮单击事件使用输入元素的 id
- python-3.x - 如何从python中的列中提取字符串
- go - Pivot map[key] 反转不会恢复正确的值
- html - CSS 中的内部表单对齐:对齐输入框和文本字符串的困难
- c++ - 抛出异常:读取访问冲突。_Scary 是 nullptr
- linux - 为什么应用程序不能直接访问硬件设备?为什么我们需要切换到内核空间才能做到这一点?
- dart - AES 的数据长度无效
- android - 我应该为不同的客户使用多个 Firebase 项目,但使用相同的应用程序还是只为 FCM 使用一个?
- azure - 使用 Java Spring 应用程序连接到 Azure 服务总线 - 超时