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


129

私は得ています

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

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

回答:


202

これは通常、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';

1
これがおそらく他のアプローチ(私にとって)が他のエラー(「プロシージャ、関数、パッケージ、またはタイプはここでは許可されていません」や「キー保持されていないテーブルエラーにマップされている列を変更できない」などのエラーを返す理由ですビューに挿入します ')。〜他の人に役立つ場合は、distinctinを追加した後でも、内部クエリの結合を再配置するまで同じエラーが発生するため、複数の行が返されてそこから内部結合されるテーブルから始めました...理にかなっています。
jinglesthula

40

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


1
+1、ありがとうございます。これは、(少なくともマージで使用されたキーに基づいて)重複が少ないターゲットテーブルで発生しました。
tbone 2013年

6

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

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

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

または

システム設定イベント「30926トレース名エラースタックオフ」を変更します。

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

2)SQLステートメントを見つけたら、それが正しいかどうか(おそらく、Explain Planまたは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)テーブル上のチェーンまたは移行されたROWSを確認して削除します。PCTFREEの正しい設定など、これを最小限に抑える方法があります。Note 122020.1-行の連鎖と移行を使用してください4.3)テーブルがさらにインデックス編成されている場合は、次を参照してください:Note 102932.1-IOTでの連鎖された行の監視


5

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

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

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

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


NETWORK_LINK統計収集の段階で、ネットワーク経由で(ソースデータベースに直接接続するパラメーターを使用して)データポンプインポートを実行すると、エラーメッセージが表示されました。強調表示されているメモで説明されています。幸い、統計だけが影響を受けました。
Mark Stewart

1
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回目はコミットによるものでした

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

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


-1

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

使用して()句で指定されたデータのセットはの重複値がないことを確認する必要が結合列を、すなわちON()句内の列

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.