0

一个关键应用程序无缘无故地返回 SQLSTT='42912'。我们的 V7R2 开发分区上周末是 PTF 的,经过一些重构后,我今天重新编译了程序。该程序在 Dev 和我的 V7R1 (sigh) 离线系统中正常工作;当我将目标代码移动到尚未 PTF 的 V7R2 生产分区时,程序失败并出现此错误。

我声明了一个游标“FOR UPDATE”,而不是指定要更新的列(意味着所有列都符合条件)。错误消息“无法更新列 HVR00001”表示我正在尝试更新未在 DECLARE CURSOR 语句中定义的列。我的任何代码中都不存在列 HVR00001,我恭敬地建议此错误消息将发送很多人进行狙击狩猎。

从此开始...

      EXEC SQL
      DECLARE gsr010_frp001_cursor CURSOR WITH HOLD FOR
      SELECT *
      FROM frp001
      WHERE fhpro = :fhpro
      FOR UPDATE;

打开游标后,如下:

      EXEC SQL
      FETCH NEXT FROM gsr010_frp001_cursor INTO :frp001;

在大量的应用程序代码和 SQL 之后,这就是失败的地方:

         EXEC SQL
         UPDATE frp001
         SET ROW = :frp001
         WHERE CURRENT OF gsr010_frp001_cursor;

将程序编译到 V7R1M0 可以消除错误,这表明 PTF 至少有一个缺陷。另一种解决方案是定义更新的列(超过 100 个),但我有一个工具可以识别更新的列(这对性能会更好)。

我是否误读了 SQL 文档 WRT 游标更新,或者这是一个真正的错误?

4

1 回答 1

0

文档指出:
如果指定的 UPDATE 子句没有列名列表,则隐式列名列表确定如下:

  • 如果启用了扩展指示变量,则在全查询的第一个 FROM 子句中标识的表或视图的所有列。
  • 否则,在全查询的第一个 FROM 子句中标识的表或视图的所有可更新列。
  • 并非所有人本身都符合条件 - 但 SELECT 列表中的所有内容都符合条件。现在你和我会说 * 会使他们所有人都符合条件。但这可能不是系统所看到的。
  • 我建议列出您要使用的字段。无论如何,出于多种原因,这样做是一种很好的做法,它是自我记录的。您只检索您真正需要的数据、自我记录等。它可能会解决您遇到的问题。
于 2019-08-08T16:52:51.887 回答