ORA-30926: tidak bisa mendapatkan kumpulan baris yang stabil di tabel sumber

129

Saya mendapatkan

ORA-30926: tidak bisa mendapatkan kumpulan baris yang stabil di tabel sumber

dalam kueri berikut:

  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';

Saya telah menjalankannya table_1memiliki data dan juga saya telah menjalankan query dalam ( src) yang juga memiliki data.

Mengapa kesalahan ini terjadi dan bagaimana cara mengatasinya?

Di mana-mana
sumber

Jawaban:

202

Ini biasanya disebabkan oleh duplikat dalam kueri yang ditentukan dalam klausa USING. Ini mungkin berarti bahwa TABLE_A adalah tabel induk dan ROWID yang sama dikembalikan beberapa kali.

Anda dapat dengan cepat menyelesaikan masalah dengan menggunakan DISTINCT dalam kueri Anda (pada kenyataannya, jika 'Y' adalah nilai konstan Anda bahkan tidak perlu memasukkannya ke dalam kueri).

Dengan asumsi permintaan Anda benar (tidak tahu tabel Anda), Anda bisa melakukan sesuatu seperti ini:

  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';
Pop
sumber
1
Ini mungkin mengapa pendekatan lain (untuk saya) juga mengembalikan kesalahan lain untuk saya (seperti 'prosedur, fungsi, paket atau jenis tidak diperbolehkan di sini' dan 'Tidak dapat memodifikasi kolom yang memetakan ke kesalahan tabel yang tidak diawetkan kunci saat mencoba untuk masukkan ke tampilan '). ~ Jika itu membantu orang lain, saya mendapatkan kesalahan yang sama bahkan setelah menambahkan berbeda sampai saya mengatur kembali gabungan permintaan dalam saya jadi saya mulai dengan tabel yang mendapatkan lebih dari satu baris dikembalikan dan bagian dalam bergabung dari sana ... jika itu masuk akal.
jinglesthula
40

Anda mungkin mencoba memperbarui baris tabel target yang sama beberapa kali. Saya baru saja mengalami masalah yang sama dalam pernyataan gabungan yang saya kembangkan. Pastikan pembaruan Anda tidak menyentuh catatan yang sama lebih dari satu kali dalam pelaksanaan penggabungan.

DCookie
sumber
1
+1, terima kasih, ini baru saja terjadi pada saya di tabel target dengan sejumlah kecil duplikat (setidaknya berdasarkan kunci yang digunakan dalam penggabungan).
Tulang
6

Bagaimana Mengatasi Masalah Kesalahan ORA-30926? (Doc ID 471956.1)

1) Identifikasi pernyataan gagal

mengubah sesi set peristiwa '30926 nama jejak kesalahan tingkat 3';

atau

ubah set sistem acara '30926 trace name errorstack off';

dan perhatikan file .trc di UDUMP ketika itu terjadi.

2) Setelah menemukan pernyataan SQL, periksa apakah itu benar (mungkin menggunakan menjelaskan rencana atau tkprof untuk memeriksa rencana eksekusi permintaan) dan menganalisis atau menghitung statistik pada tabel yang bersangkutan jika ini belum dilakukan. Indeks pembangunan kembali (atau menjatuhkan / menciptakan kembali) juga dapat membantu.

3.1) Apakah pernyataan SQL MERGE? mengevaluasi data yang dikembalikan oleh klausa USING untuk memastikan bahwa tidak ada nilai duplikat dalam bergabung. Ubah pernyataan gabungan untuk memasukkan klausa deterministik di mana

3.2) Apakah ini pernyataan UPDATE melalui tampilan? Jika demikian, coba populasikan hasil tampilan ke dalam tabel dan coba perbarui tabel secara langsung.

3.3) Apakah ada pemicu di atas meja? Coba nonaktifkan untuk melihat apakah masih gagal.

3.4) Apakah pernyataan tersebut mengandung tampilan yang tidak dapat digabungkan dalam 'Sub-Sub -eri'? Ini dapat menghasilkan baris duplikat yang dikembalikan jika kueri memiliki klausa "UNTUK DIPERBARUI". Lihat Bug 2681037

3.5) Apakah tabel memiliki kolom yang tidak digunakan? Menjatuhkan ini dapat mencegah kesalahan.

4) Jika memodifikasi SQL tidak menyembuhkan kesalahan, masalahnya mungkin dengan tabel, terutama jika ada baris dirantai. 4.1) Jalankan pernyataan 'ANALYZE TABLE VALIDATE STRUCTURE CASCADE' pada semua tabel yang digunakan dalam SQL untuk melihat apakah ada korupsi dalam tabel atau indeksnya. 4.2) Periksa, dan hilangkan, setiap BARIS RANTAI atau dimigrasi di atas meja. Ada beberapa cara untuk meminimalkan ini, seperti pengaturan PCTFREE yang benar. Gunakan Catatan 122020.1 - Perangkaian Baris dan Migrasi 4.3) Jika tabel tersebut tambahan Indeks Terorganisir, lihat: Catatan 102932.1 - Memantau Baris Dirantai pada IOT

Tagar
sumber
5

Apakah kesalahan hari ini pada 12c dan tidak ada jawaban yang sesuai (tidak ada duplikat, tidak ada ekspresi non-deterministik dalam klausa WHERE). Kasus saya terkait dengan kemungkinan penyebab kesalahan lainnya, menurut teks pesan Oracle (penekanan di bawah):

ORA-30926: tidak bisa mendapatkan kumpulan baris yang stabil di tabel sumber
Penyebab: Kumpulan baris yang stabil tidak bisa didapat karena aktivitas dml yang besar atau klausa non-deterministik tempat klausa.

Penggabungan adalah bagian dari batch yang lebih besar, dan dieksekusi pada database langsung dengan banyak pengguna secara bersamaan. Tidak perlu mengubah pernyataan itu. Saya hanya melakukan transaksi sebelum penggabungan, kemudian menjalankan penggabungan secara terpisah, dan melakukan lagi. Jadi solusinya ditemukan dalam tindakan pesan yang disarankan:

Tindakan: Hapus klausa non-deterministik mana saja dan keluarkan kembali dml .

Cee McSharpface
sumber
Saya mendapatkan pesan kesalahan itu melakukan impor DataPump melalui jaringan (menggunakan NETWORK_LINKparameter yang terhubung langsung ke basis data sumber) selama tahap pengumpulan statistik, dan catatan yang Anda sorot mungkin menjelaskannya. Untungnya hanya statistik yang terpengaruh.
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.

Kesalahan ini terjadi pada saya karena duplikat catatan (16K)

Saya mencoba dengan unik itu berhasil .

tetapi sekali lagi ketika saya mencoba bergabung tanpa masalah unik yang sama terjadi Kedua kalinya itu karena komit

setelah bergabung jika komit tidak dilakukan, kesalahan yang sama akan ditampilkan.

Tanpa unik, Kueri akan berfungsi jika komit diberikan setelah setiap operasi penggabungan.

v8-E
sumber
-1

Klarifikasi lebih lanjut untuk penggunaan DISTINCT untuk menyelesaikan kesalahan ORA-30926 dalam kasus umum:

Anda perlu memastikan bahwa kumpulan data yang ditentukan oleh klausa USING () tidak memiliki nilai duplikat dari kolom gabungan , yaitu kolom di klausa ON () .

Dalam contoh OP di mana klausa USING hanya memilih kunci, itu sudah cukup untuk menambahkan DISTINCT ke klausa USING. Namun, dalam kasus umum klausa USING dapat memilih kombinasi kolom kunci yang cocok dan kolom atribut untuk digunakan dalam klausa UPDATE ... SET. Oleh karena itu dalam kasus umum, menambahkan DISTINCT ke klausa USING masih akan memungkinkan baris pembaruan berbeda untuk kunci yang sama, dalam hal ini Anda masih akan mendapatkan kesalahan ORA-30926.

Ini adalah penjabaran dari jawaban DCookie dan poin 3.1 dalam jawaban Tagar, yang dari pengalaman saya mungkin tidak segera jelas.

Durban_legend
sumber