【问题标题】:Get rows affected by an update获取受更新影响的行
【发布时间】:2011-06-11 04:17:05
【问题描述】:

您如何在 AS400 上的 DB2 中获得受 SQL UPDATE 语句影响的确切行

查看刚刚更新的行非常有用,在测试期间更是如此。

我看到this question: 是一样的,但特定于 MySQL。是否有标准的 SQL 方式或 DB2 特定的方式来执行此操作?

我也看到了this technique,但是我不能用,因为我的更新查询太复杂了。

附加功能可能是:还这些行的先前版本,因此您可以将其与实际版本(更新后)进行比较并查看修改。

编辑:我的 DB2 版本 是 IBM i V5R3 和 V6R1 的版本

【问题讨论】:

  • 复杂并不是“这种技术”背后的建议的唯一问题。您有一个竞争条件,即在计算行数和更改行数之间可能会发生变化。这不是可靠的信息。

标签: database db2 ibm-midrange


【解决方案1】:

你没有说你运行的是什么版本的 i5/OS,但是如果你运行的是 V6R1 或更高版本,你可以使用“数据更改表引用”来查看更新语句修改的行。例如:

select * from FINAL TABLE ( update yourtable set c1 = x where ... )

FINAL TABLE 将在触发任何/所有触发器后为您提供行。请注意,还有另一个数据更改表引用,NEW TABLE - 它将在行受到任何触发器影响之前显示行。

您可以在i5/OS documentation 中阅读有关数据更改表引用的信息。

【讨论】:

  • 谢谢伊恩!但是查看文档后,我意识到在 DB2 for IBM i 上,此命令尚不可用 :( 对于任何版本。唯一可用的功能是选择插入的值 (publib.boulder.ibm.com/infocenter/iseries/v6r1m0/…),从 V6R1 开始。
  • 请注意“从插入中选择”表达式可能会有很大的性能开销,因为创建临时表 iprodeveloper.com/[primary-term]/…... 至少在 v6r1 中,这实际上消除了减少往返次数。所以它可能只值得大量插入/更新的行。
【解决方案2】:
GET DIAGNOSTICS updated_rows = ROW_COUNT;

在这里查看:GET DIAGNOSTICS statement

您的“附加功能”听起来像是您想要一个触发器。

以交互方式,使用STRSQL,这样的响应消息会在语句完成后显示在屏幕上。

【讨论】:

  • @Lynette 谢谢!我也可以在批处理中(而不是在过程中)使用此语句吗? IE。 UPDATE MYTABLE SET MYFIELD = 'foo' WHERE COLOR='red'; GET DIAGNOSTICS ROW_COUNT; 或类似的东西。你能告诉我怎么做吗?我只看到过程中使用的示例。
  • @Lynette 无论如何,它似乎无法返回修改后的行,但只能返回它们的数量..
  • @bluish 来自文章:“这条语句只能嵌入到应用程序、SQL函数、SQL过程或触发器中。它不能交互式发出。它是一个可执行语句,不能动态准备好了。”批处理 = 是
  • @bluish 它肯定会捕获修改后的行,我一直都在使用它。我相信我已经回答了你的问题,除非你想编辑它并更具体? “批量(不是程序)”是什么意思?您当然可以以 BATCH 或 INTERACTIVELY 方式执行过程。 :)
  • @Lynette 我根据this definition说“batch”,也就是一系列用分号分隔的语句。所以,根据你上报的文档,我担心这条指令不能批量执行。
猜你喜欢
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 2011-10-03
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多