0

重要なアプリケーション プログラムが、明確な理由もなく SQLSTT='42912' を返しています。私たちの V7R2 開発パーティションは先週末に PTF が適用され、少しリファクタリングした後、今日プログラムを再コンパイルしました。プログラムは Dev と私の V7R1 (ため息) オフライン システムで正しく動作します。オブジェクト コードを、まだ 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 に少なくとも 1 つの欠陥があることを示しています。別の解決策は、更新された列を定義することです (100 以上あります) が、更新された列を識別できるツールがあります (パフォーマンスが向上します)。

SQL ドキュメントの WRT カーソル更新を読み間違えたのでしょうか、それともこれは本当のエラーですか?

4

1 に答える 1

0

ドキュメントには次のように記載
されています。UPDATE句が列名リストなしで指定されている場合、暗黙的な列名リストは次のように決定されます。

  • 拡張標識変数が使用可能な場合、全選択の最初の FROM 文節で識別された表またはビューのすべての列。
  • それ以外の場合は、全選択の最初の FROM 文節で識別された表またはビューの更新可能なすべての列。
  • それ自体すべてが適格というわけではありませんが、SELECT のリストにあるものはすべて適格です。ここで、あなたと私は、* はそれらすべてを適格にすると言います。しかし、それはシステムが認識するものではないかもしれません。
  • 使用したいフィールドをリストアップすることをお勧めします。とにかく、多くの理由でそれを行うことをお勧めします。それは自己文書化です。本当に必要なデータ、自己文書化などのみを取得すると、発生している問題が解決する場合があります。
于 2019-08-08T16:52:51.887 に答える