Saya mendapatkan
ORA-30926: mampu untuk mendapatkan satu set stabil baris dalam tabel sumber
dalam query 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';
I've ran table_1
itu memiliki data dan juga saya've ran dalam query (src
) yang juga memiliki data.
Mengapa kesalahan ini datang dan bagaimana hal itu dapat diselesaikan?
Hal ini biasanya disebabkan oleh duplikat dalam query yang ditentukan dalam MENGGUNAKAN klausa. Ini mungkin berarti bahwa TABLE_A adalah orang tua dan meja yang sama ROWID kembali beberapa kali.
Anda dapat dengan cepat memecahkan masalah dengan menggunakan alat yang BERBEDA dalam query (pada kenyataannya, jika 'Y' adalah nilai konstan yang anda don't bahkan perlu untuk dimasukkan ke dalam query).
Dengan asumsi permintaan anda benar (don't know your tabel) 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';
Anda're mungkin mencoba untuk meng-update baris yang sama dari tabel target beberapa kali. Saya hanya mengalami sedikit masalah yang sama dalam menggabungkan pernyataan saya kembangkan. Pastikan anda update tidak menyentuh rekor yang sama lebih dari sekali dalam pelaksanaan penggabungan.
Cara Memecahkan ORA-30926 Kesalahan? (Doc ID 471956.1)
mengubah sesi mengatur acara '30926 jejak nama errorstack tingkat 3';
atau
alter system set acara '30926 jejak nama errorstack off';
dan untuk menonton .kkr file di UDUMP ketika itu terjadi.
3.1) Adalah pernyataan SQL yang BERGABUNG? mengevaluasi data kembali dengan MENGGUNAKAN klausul untuk memastikan bahwa tidak ada nilai-nilai duplikat di join. Memodifikasi menggabungkan pernyataan untuk memasukkan deterministik mana klausa
3.2) ini pernyataan UPDATE melalui view? Jika demikian, cobalah mengisi melihat hasilnya ke dalam tabel dan mencoba memperbarui tabel ini diatas.
3.3) Apakah ada pemicu di atas meja? Cobalah menonaktifkan itu untuk melihat apakah itu masih gagal.
3.4) Apakah pernyataan mengandung non-mergeable melihat dalam 'DI-Subquery'? Hal ini dapat mengakibatkan duplikasi baris yang dikembalikan if permintaan "UNTUK UPDATE" klausa. Melihat Bug 2681037
3.5) Tidak memiliki meja yang tidak terpakai kolom? Menjatuhkan ini dapat mencegah kesalahan.
Memiliki kesalahan hari ini pada 12c dan tidak ada jawaban yang sesuai (tidak ada duplikat, tidak ada non-deterministik ekspresi dalam klausa WHERE). Kasus saya adalah terkait dengan yang lain yang mungkin menyebabkan kesalahan, menurut Oracle's pesan teks (penekanan di bawah ini):
ORA-30926: mampu untuk mendapatkan satu set stabil baris dalam tabel sumber Penyebab: Satu set stabil baris tidak bisa masuk karena besar dml kegiatan atau non-deterministik klausa where.
Penggabungan ini merupakan bagian dari batch yang lebih besar, dan dieksekusi pada database dengan banyak pengguna secara bersamaan. Ada tidak perlu untuk mengubah pernyataan. Saya baru saja melakukan transaksi sebelum bergabung, kemudian berlari penggabungan secara terpisah, dan dilakukan lagi. Jadi solusinya ditemukan dalam menyarankan tindakan pada pesan:
Tindakan: Menghapus setiap non-deterministik dimana klausa dan ulang 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.
Kesalahan ini terjadi bagi saya karena catatan duplikat(16K)
I mencoba dengan unik ini bekerja .
tapi lagi-lagi ketika saya mencoba menggabungkan tanpa unik proble sama terjadi Kedua waktu itu karena untuk melakukan
setelah penggabungan jika melakukan tidak melakukan Kesalahan yang sama akan ditampilkan.
Tanpa unik, Query akan bekerja jika melakukan diberikan setelah setiap operasi gabungan.
Sebuah klarifikasi lebih lanjut untuk penggunaan yang BERBEDA untuk mengatasi error ORA-30926 dalam kasus umum:
Anda perlu memastikan bahwa set data tertentu dengan MENGGUNAKAN() klausa tidak memiliki nilai-nilai duplikat dari bergabung kolom, yaitu kolom di ATAS() pasal.
Di OP's contoh di mana MENGGUNAKAN klausa hanya memilih kunci, itu cukup untuk menambah BERBEDA dengan MENGGUNAKAN klausa. Namun, dalam kasus umum yang MENGGUNAKAN klausa dapat memilih kombinasi dari kolom kunci untuk mencocokkan dan atribut kolom yang akan digunakan di UPDATE ... SET clause. Oleh karena itu dalam kasus umum, menambahkan BERBEDA dengan MENGGUNAKAN klausa masih akan memungkinkan pembaruan yang berbeda baris kunci yang sama, dalam hal ini anda masih akan mendapatkan ORA-30926 kesalahan.
Ini merupakan penjabaran dari DCookie's jawaban dan titik 3.1 di Tagar's jawaban, yang dari pengalaman saya mungkin tidak segera jelas.