146

私は得ています

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)を実行しました。

なぜこのエラーが発生し、どのように解決できるのでしょうか。

4

7 に答える 7

224

これは通常、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';
于 2010-02-25T20:42:29.933 に答える
47

ターゲットテーブルの同じ行を複数回更新しようとしている可能性があります。私が開発したマージステートメントで、まったく同じ問題が発生しました。マージの実行中に、更新が同じレコードに2回以上触れないようにしてください。

于 2010-02-25T20:21:02.987 に答える
6

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

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

セッションセットイベントの変更'30926トレース名エラースタックレベル3';

また

システム設定イベントの変更'30926トレース名エラースタックオフ';

UDUMPで.trcファイルが発生した場合はそれを監視します。

2)SQLステートメントを見つけたら、それが正しいかどうかを確認し(おそらく、explainプランまたは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で使用されるすべてのテーブルに対して「ANALYZETABLE VALIDATE STRUCTURE CASCADE」ステートメントを実行して、テーブルまたはそのインデックスに破損がないかどうかを確認します。4.2)テーブル上のCHAINEDまたは移行されたROWSを確認し、排除します。PCTFREEを正しく設定するなど、これを最小限に抑える方法があります。ノート122020.1を使用-行の連鎖と移行4.3)テーブルがさらにインデックス編成されている場合は、以下を参照してください。ノート102932.1-IOTでの連鎖行の監視

于 2016-04-01T21:44:32.777 に答える
6

一般的な場合のエラーORA-30926を解決するためのDISTINCTの使用に関するさらなる説明:

USING()句で指定されたデータのセットに、結合列、つまりON()句の列 の重複する値がないことを確認する必要があります。

USING句がキーのみを選択するOPの例では、USING句にDISTINCTを追加するだけで十分でした。ただし、一般的な場合、USING句は、一致するキー列とUPDATE...SET句で使用される属性列の組み合わせを選択できます。したがって、一般的なケースでは、USING句にDISTINCTを追加しても、同じキーに対して異なる更新行が許可されます。その場合でも、ORA-30926エラーが発生します。

これは、DCookieの回答とTagarの回答のポイント3.1の詳細であり、私の経験からはすぐには明らかではないかもしれません。

于 2019-02-14T13:56:43.477 に答える
5

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

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

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

処置:非決定論的なwhere句を削除して、dmlを再発行してください。

于 2016-06-21T10:41:21.083 に答える
2
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)

はそれがうまくいったユニークなもので試しました

しかし、もう一度、一意の同じ問題が発生せずにマージを試みたとき、2回目はコミットによるものでした

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

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

于 2018-07-26T02:38:49.627 に答える
1

数時間後にはこれを解決できませんでした。最終的には、2つのテーブルを結合して選択を行い、抽出を作成し、テーブル内の500行に対して個別のSQL更新ステートメントを作成しました。醜いですが、クエリを機能させるために何時間も費やすよりも優れています。

于 2020-11-09T23:54:50.567 に答える