存储过程中的约束更新语句

Posted

技术标签:

【中文标题】存储过程中的约束更新语句【英文标题】:Constrained update statements in a stored procedure 【发布时间】:2016-11-12 08:13:46 【问题描述】:

我想在存储过程中编写 3 个更新语句。如何确认只有在第一个更新语句成功完成后才会执行第二个和第三个更新语句?

create or replace procedure test
as
begin

update statement1;
commit;

--following block executes only when update 1 is sucessful
update statement2;
commit;

update statement2;
commit;
end;

我不想使用 SQL 查询检查第一个更新语句的状态,因为表正在更新 - 它太大了。

【问题讨论】:

你如何定义“成功”?没有发生错误;任何行都已实际更新;具体数量是;或者是其他东西? (为什么你在每条语句之后都提交 - 所有三个更新不应该是同一个事务的一部分吗?) 嗨,Alex,我只是想确保更新执行没有错误。 如果出现错误,则程序将终止,因为您没有捕获任何异常 - 调用者将看到引发的任何错误。这是默认行为。你不需要做任何其他事情。请注意,如果 second 更新出错,同样的事情也会发生,但是您已经提交了第一次更新,因此无论以后发生什么,更改都是永久性的。确保这是你真正想要的。 明白。但是让我们考虑一个场景,在 update statement1 中没有更新任何行。在那种情况下,我不想继续接下来的两个陈述。 【参考方案1】:

您可以看到有多少行受到the SQL%ROWCOUNT implicit cursor attribute 语句的影响:

create or replace procedure test
as
begin

  update statement1;
  --commit;

  --following block executes only when update 1 is sucessful
  if sql%rowcount > 0 then
    update statement2;
    --commit;

    update statement2;
    --commit;
  end if;
end;

如果没有更新行,则行数将为零,if 中的语句将被跳过。

如果发生实际错误then execution stops anyway。

我已经注释掉了你的提交语句,因为你需要确保你理解它们的含义。我通常希望一个过程中的所有语句都是同一个逻辑事务的一部分,事务控制由调用者(或 its 调用者)处理。如果您在第一次更新后提交并在第二次更新时出错,那么您的数据可能会处于不一致的状态。

【讨论】:

哦...如此简单...这就是为什么您在休息日工作时需要第二双眼睛的原因。 :)。谢谢老兄。

以上是关于存储过程中的约束更新语句的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER 触发器

oracle中的存储过程有啥作用,该怎么理解?(数据更新的话用update语句不就完了吗)

sql 在一个sql语句中删除所有表,存储过程,触发器,约束和所有依赖项

一次性删除数据库所有表和所有存储过程 SQL语句

SQLServer实用查询脚本

SQLServer 2008:来自 JAVA 的存储过程调用在执行插入和更新语句时返回错误