1

SQL Server 的 SET NOCOUNT ON 的 DB2 等效项是什么?

“来自 SQL Server 文档:

SET NOCOUNT ON... 停止显示受 Transact-SQL 语句或存储过程影响的行数的消息作为结果集的一部分返回...

对于包含多个不返回太多实际数据的语句的存储过程,或者对于包含 Transact-SQL 循环的过程,将 SET NOCOUNT 设置为 ON 可以显着提高性能,因为网络流量大大减少。”

我的问题是,如果我更新表中的一行,则会运行一个触发器来更新另一个表中的另一行。

在 Hibernate 中,我收到此错误:“批量更新从更新返回了意外的行数;实际行数:2;预期:1”。

我认为由于触发器 DB2 返回 2 而不是 1,这是正确的。但是,有什么方法可以让 DB2 在不删除触发器的情况下返回 1,或者我可以禁用 Hibernate 中的检查吗?如何处理这个问题?谁能告诉 db2 中等效的“Set NoCount on”(sql server)?

4

1 回答 1

1

DB2 中没有等价物,SET NOCOUNT因为在 DML 语句成功完成后 DB2 不会产生任何信息性消息。相反,DB2 驱动程序将这种类型的信息存储在称为SQL 通信区域 (SQLCA)的本地特定于连接的数据结构中。由应用程序(或应用程序使用的任何数据库框架或 API)决定在执行每个语句后检查哪些 SQLCA 变量。

在您的情况下,您的应用程序已将其数据库交互委托给 Hibernate,它将 DB2 在 SQLCA 中报告的受影响行数与 Hibernate 期望其 UPDATE 语句更改的行数进行比较。由于 Hibernate 不知道您创建的 AFTER UPDATE 触发器,它希望 update 语句只影响一行,但 SQLCA 显示两行已更新(一个由 Hibernate 的更新语句,另一个由 AFTER UPDATE 触发器在那个表),因此 Hibernate 抛出异常来抱怨差异。

这使您有两个选择:

  1. 从该表中删除触发器,而是在 Hibernate 中定义等效的后续操作。如果其他不使用 Hibernate 的应用程序也在更新有问题的表,这不是一个理想的解决方案,但这是团队在对数据库施加 Hibernate 时做出的那种决定。
  2. 将 AFTER UPDATE 触发器保留在 DB2 中的位置,并检查定义 Hibernate 对象映射的选项以确定是否有一种方法可以至少暂时禁用 Hibernate 的行计数验证逻辑。一种看起来特别令人鼓舞的方法是将ResultCheckStyle.NONE选项指定为自定义@SQLUpdate 注释的一部分。

对于 SQL Server 和 Sybase,似乎还有第三种选择:通过SET NOCOUNT ON在触发器内激活,从 Hibernate 隐藏 AFTER UPDATE 触发器的活动。不幸的是,在 DB2(或 Oracle,就这点而言)中没有等价物允许应用程序在计算受影响的行数时有选择地跳过某些活动。

于 2013-08-06T06:39:13.623 回答