オーラ-30926:できない安定した行のセットは、ソーステーブル
質問
を取得しています
オーラ-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が複数回返されることを意味します。
あなたはすぐに(「Y」は一定の値である場合は、実際に、あなたもクエリでそれを配置する必要はありません)あなたのクエリでDISTINCTを使用して問題を解決することができます。
あなたはこのような何かを行うことができます(あなたのテーブルを知らない)クエリが正しいと仮定します:
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';
他のヒント
あなたはおそらく、ターゲットテーブルの複数回の同じ行を更新するためにしようとしています。私はちょうど私が開発したMERGE文に非常に同じ問題に遭遇しました。ことを確認してください更新は、マージの実行中に複数回、同じレコードには触れません。
どのようにトラブルシューティングORA-30926エラーが発生しますか? (ドキュメントID 471956.1)
1)失敗したステートメントを識別します。
ALTERセッションセットイベント「30926トレース名errorStackがレベル3」;
または
ALTER SYSTEMセットイベント「30926トレース名はオフerrorStackが」;
と、それが発生したときます。
udumpの中で.trcのファイルを監視 それが正しい場合は、2)が、おそらくこれは、最近行われていない場合、クエリの実行計画を確認するために計画またはTKPROFを説明)し、分析や関係テーブル上の計算統計使用(SQL文、チェックを発見しました。再構築(または再作成/ドロップ)インデックスがあまりにも役立つかもしれません。
3.1)SQLステートメントは、MERGEですか? 参加するには重複する値が存在しないことを確実にするUSING句によって返されたデータを評価します。決定論的句
が含まれるようにMERGE文を変更します3.2)このビュー経由UPDATEステートメントですか? もしそうなら、テーブルにビューの結果を移入しようとすると、直接テーブルを更新してみてください。
3.3)テーブルの上にトリガがありますか?それでも失敗するかどうかを確認するために、それを無効にしてみてください。
3.4)ステートメントは、「IN-サブクエリ」非マージ可能ビューが含まれていますか?クエリは、「FOR UPDATE」句を持っている場合、これは重複する行が返されるにつながることができます。バグ2681037
を参照してください。3.5)テーブルには、未使用の列を持っていますか?これらを削除すると、エラーを防ぐことができます。
SQLを変更するとエラーが硬化しない場合は、4)、問題が連鎖行がある場合は特に、テーブルがある可能性があります。 4.1)任意のテーブル内の破損またはその索引があるかどうかを確認するためにSQLで使用されるすべてのテーブル上の声明「TABLE VALIDATE STRUCTURE CASCADE ANALYZE」を実行します。 4.2)を確認し、そして排除、テーブル上の任意の連鎖または移行ROWS。このようPCTFREEの正しい設定としてこれを最小化する方法があります。 使用注122020.1 - 行連鎖と移行 4.3テーブルは、さらに索引構成の場合)、以下を参照してください。 注102932.1 - のIOTに連鎖行を監視する
たエラーは日本が12cにお答え合(複製、非決定論的表現のWHERE句).私の場合は関連するその他のエラー原因によると、オラクルのメッセージテキストを重視し):
オーラ-30926:できない安定した行のセットは、ソーステーブル
原因:安定した行のセットできなかった ていますが、これらのdml活動 または、非決定的な場を提供しています。
を合併した大きなバッチした上で実行されるライブデータベースに多くの同時のユーザーが変える必要があります。う為取引の前に統合した合併には別途、犯ます。その解決策を見出すことに合意した、とのメッセージ:
アクション:除非決定性が条項と 再発行の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 して独特のうまくいった .
そんな中、もしくは合併しない独自の同proble発生した 二時間でしたコミット
後の合併がコミットは同じエラーが表示されます。
なく、クエリー作品がコミットを与えた後に合併します。
更なる解明のご利用にな解決のエラーオ-30926さらに一般の場合:
することを確実にしなければならなセットの指定されたデータの利用()条項は、複製値を 参列, (の カラムの()の項.
にOPの例は、使用条項だけを選んでキーで十分に加え個別の利用を提供しています。しかし、一般の場合には、使用条項を選択組み合わせキー列を一致する属性カラムで使用する更新...セットを提供しています。そのために一般の場合、追加で個別に利用条項だくことができるよう更新を行同じキーの場合も、ORA-30926エラーになります。
これは家のDCookieの回答のポイント3.1Tagarの答えは、私の経験からない場合、すぐに自明である。