web-dev-qa-db-ja.com

ORA-30926:ソース表の安定した行セットを取得できません

私は得ています

ORA-30926:ソース表の安定した行セットを取得できません

次のクエリで:

  MERGE INTO table_1 a
      USING 
      (SELECT a.ROWID row_id, 'Y'
              FROM table_1 a ,table_2 b ,table_3 c
              WHERE a.mbr = c.mbr
              AND b.head = c.head
              AND b.type_of_action <> '6') src
              ON ( a.ROWID = src.row_id )
  WHEN MATCHED THEN UPDATE SET in_correct = 'Y';

データを含むtable_1を実行し、データも含む内部クエリ(src)を実行しました。

なぜこのエラーが発生し、どのように解決できますか?

112
Omnipresent

これは通常、USING句で指定されたクエリの重複が原因です。これはおそらく、TABLE_Aが親テーブルであり、同じROWIDが数回返されることを意味します。

クエリでDISTINCTを使用すると、問題をすばやく解決できます(実際、 'Y'が定数値である場合、クエリに含める必要さえありません)。

クエリが正しい(テーブルがわからない)と仮定すると、次のようなことができます。

  MERGE INTO table_1 a
      USING 
      (SELECT distinct ta.ROWID row_id
              FROM table_1 a ,table_2 b ,table_3 c
              WHERE a.mbr = c.mbr
              AND b.head = c.head
              AND b.type_of_action <> '6') src
              ON ( a.ROWID = src.row_id )
  WHEN MATCHED THEN UPDATE SET in_correct = 'Y';
176
Pop

おそらく、ターゲットテーブルの同じ行を複数回更新しようとしています。私が開発したマージステートメントで、まさに同じ問題に遭遇しました。更新がマージの実行中に同じレコードに複数回触れないようにしてください。

38
DCookie

ORA-30926エラーのトラブルシューティング方法は? (ドキュメントID 471956.1)

1)失敗したステートメントを特定する

セッションセットイベント「30926トレース名エラースタックレベル3」を変更します。

または

システム設定イベント「30926 trace name errorstack off」を変更します。

また、UDUMPが発生したときに.trcファイルを監視します。

2)SQLステートメントを見つけたら、それが正しいかどうかを確認し(おそらく、実行計画またはtkprofを使用してクエリ実行計画を確認します)、これが最近行われていない場合は、関連するテーブルの統計を分析または計算します。インデックスの再構築(または削除/再作成)も役立つ場合があります。

3.1)SQLステートメントはMERGEですか? USING句によって返されるデータを評価して、結合に重複する値がないことを確認します。確定ステートメントのwhere句を含めるようにマージステートメントを変更します

3.2)これはビューを介したUPDATEステートメントですか?その場合、ビューの結果をテーブルに入力して、テーブルを直接更新してみてください。

3.3)テーブルにトリガーはありますか?無効にしてみて、まだ失敗するかどうかを確認してください。

3.4)ステートメントに「INサブクエリ」にマージできないビューが含まれていますか?これにより、クエリに「FOR UPDATE」句がある場合、重複行が返される可能性があります。バグ2681037を参照

3.5)テーブルに未使用の列がありますか?これらをドロップすると、エラーを防ぐことができます。

4)SQLを変更してもエラーが解決しない場合、特に連鎖行がある場合、テーブルに問題がある可能性があります。 4.1)SQLで使用されるすべてのテーブルで「ANALYZE TABLE VALIDATE STRUCTURE CASCADE」ステートメントを実行して、テーブルまたはそのインデックスに破損がないかどうかを確認します。 4.2)テーブル上のCHAINEDまたは移行された行を確認し、排除します。 PCTFREEの正しい設定など、これを最小限に抑える方法があります。注122020.1を使用-行の連鎖と移行4.3)テーブルにさらにインデックスが編成されている場合は、注102932.1-IOTの連鎖行の監視を参照してください。

5
Tagar

12cで今日エラーが発生し、既存の回答がいずれも当てはまらない(重複がなく、WHERE節に非決定的な式がない)。 Oracleのメッセージテキスト(以下の強調)によると、私のケースはエラーの他の考えられる原因に関連していました。

ORA-30926:ソース表の安定した行セットを取得できません
原因:安定した行セットを取得できませんでした大きなdmlアクティビティのためまたは非決定論的なwhere句。

マージは、より大きなバッチの一部であり、多数の同時ユーザーがいるライブデータベースで実行されました。ステートメントを変更する必要はありませんでした。マージの前にトランザクションをコミットした後、マージを個別に実行し、再度コミットしました。そのため、解決策はメッセージの推奨アクションで見つかりました。

アクション:非決定論的なwhere句とdmlを再発行を削除してください。

3
dlatikay
SQL Error: ORA-30926: unable to get a stable set of rows in the source tables
30926. 00000 -  "unable to get a stable set of rows in the source tables"
*Cause:    A stable set of rows could not be got because of large dml
           activity or a non-deterministic where clause.
*Action:   Remove any non-deterministic where clauses and reissue the dml.

このエラーは私のために発生しました重複レコード(16K)のため

I それが機能するユニークなもので試しました

しかし、再び同じユニークな問題が発生せずにマージしようとしたとき、2回目はコミットによるものでした

コミットが行われなかった場合、マージ後に同じエラーが表示されます。

一意でない場合、各マージ操作の後にコミットが与えられると、クエリは機能します。

1
v8-E