在 Oracle 中提交和回滚 DML 语句

Posted

技术标签:

【中文标题】在 Oracle 中提交和回滚 DML 语句【英文标题】:Commit and Rollback a DML statement in Oracle 【发布时间】:2020-02-24 09:54:15 【问题描述】:

我正在尝试更新一个简单的语句。

我想要什么:

如果是true then => committed 隐式(使用任何子程序); 如果是false =>它应该回滚隐式(使用任何子程序)。

示例

Update empcp set sal = sal +1000 where empid = 1;

如果是true,则应该提交,否则回滚

【问题讨论】:

“这是真的”是什么意思?假设您运行更新,您得到“3 行更新”,您如何决定是否需要提交? 如果它不正确,则不会对 DB 进行任何更改,因为更新语句不会更新任何行。所以在声明之后做一个提交。 嗨,Aleksej “这是真的吗?”表示如果 empid 存在,则应通过任何过程或触发器完成提交(但在触发器中,由于它与 DML 语句一起工作,因此无法提交或回滚,我们可以使用 pragma automatic_transaction) loannis Barakos 你是对的,如果它是不真实的,那么数据库中不会有任何变化。但是考虑到我不想将 sal 增加超过 10% 例如:update empcp设置 sal = sal*10/100 where empid = &empid .then 如果 sal > 500 它应该回滚,否则它应该提交。在这里我不知道 empid 所以我想创建一个通用子程序,它提交有利条件并回滚不利条件。我希望我说清楚了谢谢你的回应。 【参考方案1】:

假设您正在使用 PL/SQL,您可以使用 sql%rowcount 查看最新的 DML 语句是否对任何行产生了影响。

if sql%rowcount > 0 then commit; else rollback; end if;

请记住,您必须将这段代码放在 DML 语句之后,以便sql%rowcount 产生相关的受影响行数。 有关rownum 伪列here 的更多信息。

【讨论】:

以上是关于在 Oracle 中提交和回滚 DML 语句的主要内容,如果未能解决你的问题,请参考以下文章

Oracle_事务控制语句

oracle中DDL DML指啥?

oracle中DDL DML指啥?

Oracle——控制事务

在 oracle apex 中使用保存点、提交和回滚

mysql事务的提交和回滚