私は得ています
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
)を実行しました。
なぜこのエラーが発生し、どのように解決できますか?
これは通常、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';
おそらく、ターゲットテーブルの同じ行を複数回更新しようとしています。私が開発したマージステートメントで、まさに同じ問題に遭遇しました。更新がマージの実行中に同じレコードに複数回触れないようにしてください。
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の連鎖行の監視を参照してください。
12cで今日エラーが発生し、既存の回答がいずれも当てはまらない(重複がなく、WHERE節に非決定的な式がない)。 Oracleのメッセージテキスト(以下の強調)によると、私のケースはエラーの他の考えられる原因に関連していました。
ORA-30926:ソース表の安定した行セットを取得できません
原因:安定した行セットを取得できませんでした大きなdmlアクティビティのためまたは非決定論的なwhere句。
マージは、より大きなバッチの一部であり、多数の同時ユーザーがいるライブデータベースで実行されました。ステートメントを変更する必要はありませんでした。マージの前にトランザクションをコミットした後、マージを個別に実行し、再度コミットしました。そのため、解決策はメッセージの推奨アクションで見つかりました。
アクション:非決定論的なwhere句とdmlを再発行を削除してください。
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回目はコミットによるものでした
コミットが行われなかった場合、マージ後に同じエラーが表示されます。
一意でない場合、各マージ操作の後にコミットが与えられると、クエリは機能します。