ORA-30926: kaynak tablolarda kararlı bir satır kümesi elde edilemiyor


129

alıyorum

ORA-30926: kaynak tablolarda kararlı bir satır kümesi elde edilemiyor

aşağıdaki sorguda:

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

Ben ran ettik table_1veriyi ve aynı zamanda ben oldum koştu iç sorgu (vardır srcayrıca veri var).

Bu hata neden ortaya çıktı ve nasıl çözülebilir?

Yanıtlar:


202

Bu genellikle USING yan tümcesinde belirtilen sorgudaki kopyalardan kaynaklanır. Bu muhtemelen TABLE_A'nın bir üst tablo olduğu ve aynı ROWID'nin birkaç kez döndürüldüğü anlamına gelir.

Sorgunuzda DISTINCT kullanarak sorunu hızlı bir şekilde çözebilirsiniz (aslında, 'Y' sabit bir değerse, onu sorguya koymanıza bile gerek yoktur).

Sorgunuzun doğru olduğunu varsayarsak (tablolarınızı bilmiyorsanız) şöyle bir şey yapabilirsiniz:

  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
Muhtemelen bu nedenle, diğer yaklaşımlar da (benim için) benim için başka hatalar da döndürdü ('prosedür, işlev, paket veya türe burada izin verilmiyor' ve 'denerken anahtarla korunmayan bir tablo hatasıyla eşleşen bir sütun değiştirilemez gibi. bir görünüme ekleyin '). ~ Başka birine yardımcı oluyorsa, iç sorgumun birleşimlerini yeniden düzenleyene kadar farklı ekledikten sonra bile aynı hatayı aldım, bu yüzden birden fazla satır döndürülen ve iç oradan birleştirilen tabloyla başladım ... eğer öyleyse mantıklı.
jinglesthula

40

Muhtemelen hedef tablonun aynı satırını birden çok kez güncellemeye çalışıyorsunuz. Az önce geliştirdiğim bir birleştirme ifadesinde aynı sorunla karşılaştım. Birleştirme işleminin yürütülmesinde güncellemenizin aynı kayda birden fazla kez dokunmadığından emin olun.


1
+1, teşekkürler, bu az sayıda kopyası olan bir hedef masada başıma geldi (en azından birleştirmede kullanılan anahtarlara göre).
tbone

6

ORA-30926 Hataları Nasıl Giderilir? (Belge Kimliği 471956.1)

1) Başarısız ifadeyi tanımlayın

oturum seti olaylarını değiştir '30926 izleme adı hata yığını 3';

veya

sistem seti olaylarını değiştir '30926 izleme adı errorstack off';

ve oluştuğunda UDUMP'daki .trc dosyalarını izleyin.

2) SQL ifadesini bulduktan sonra, doğru olup olmadığını kontrol edin (belki sorgu yürütme planını kontrol etmek için açıklama planını veya tkprof'u kullanın) ve eğer bu yakın zamanda yapılmadıysa ilgili tablolardaki istatistikleri analiz edin veya hesaplayın. Dizinleri yeniden oluşturmak (veya bırakmak / yeniden oluşturmak) da yardımcı olabilir.

3.1) SQL ifadesi bir MERGE mi? birleştirmede yinelenen değerler olmadığından emin olmak için USING yan tümcesi tarafından döndürülen verileri değerlendirin. Bir deterministik where cümlesi içerecek şekilde birleştirme ifadesini değiştirin

3.2) Bu bir görünüm aracılığıyla bir UPDATE ifadesi mi? Öyleyse, görünüm sonucunu bir tabloya yerleştirmeyi ve tabloyu doğrudan güncellemeyi deneyin.

3.3) Masada bir tetikleyici var mı? Hala başarısız olup olmadığını görmek için devre dışı bırakmayı deneyin.

3.4) İfade bir 'IN-Alt Sorgu'da birleştirilemez bir görünüm içeriyor mu? Bu, sorgu bir "FOR UPDATE" yan tümcesi içeriyorsa yinelenen satırların döndürülmesine neden olabilir. Hata 2681037

3.5) Tabloda kullanılmayan sütunlar var mı? Bunları düşürmek hatayı önleyebilir.

4) SQL'de değişiklik yapmak hatayı gidermiyorsa, özellikle zincirlenmiş satırlar varsa, sorun tabloda olabilir. 4.1) Tabloda veya dizinlerinde herhangi bir bozulma olup olmadığını görmek için SQL'de kullanılan tüm tablolarda 'ANALYZE TABLE VALIDATE STRUCTURE CASCADE' ifadesini çalıştırın. 4.2) Masadaki ZİNCİRLİ veya taşınmış SATIRLARI kontrol edin ve ortadan kaldırın. Doğru PCTFREE ayarı gibi bunu en aza indirmenin yolları vardır. Kullanım Notu 122020.1 - Sıra Zincirleme ve Taşıma 4.3) Tablo ek olarak Dizinle Düzenlenmişse, bkz .: Not 102932.1 - IOT'larda Zincirli Satırları İzleme


5

Bugün bir 12c'de hata vardı ve mevcut yanıtların hiçbiri uymuyor (WHERE yan tümcesinde yinelenen değil, deterministik olmayan ifadeler yok). Benim durumum, Oracle'ın mesaj metnine göre (aşağıda vurgu) hatanın diğer olası nedeni ile ilgiliydi:

ORA-30926: kaynak tablolarda kararlı bir satır kümesi elde edilemiyor
Neden: Büyük dml etkinliği veya deterministik olmayan bir where yan tümcesi nedeniyle kararlı bir satır kümesi elde edilemedi .

Birleştirme, daha büyük bir partinin parçasıydı ve birçok eşzamanlı kullanıcının bulunduğu canlı bir veritabanında yürütüldü. İfadeyi değiştirmeye gerek yoktu. İşlemi birleştirmeden önce taahhüt ettim, sonra birleştirmeyi ayrı ayrı çalıştırdım ve tekrar taahhüt ettim. Böylece çözüm, mesajın önerilen eyleminde bulundu:

Eylem: Herhangi bir deterministik olmayan where cümlelerini kaldırın ve dml'yi yeniden yayınlayın .


NETWORK_LINKİstatistik toplama aşamasında ağ üzerinden DataPump içe aktarımı yaparken ( doğrudan kaynak veritabanına bağlanan parametreyi kullanarak) bu hata mesajını alıyordum ve vurgulanan notunuz muhtemelen bunu açıklıyor. Neyse ki sadece istatistikler etkilendi.
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.

Bu Hata benim için yinelenen kayıtlar (16K) nedeniyle oluştu

Ben işe yaradı benzersiz ile çalıştı .

ama yine aynı sorun olmadan birleştirmeyi denediğimde oluştu İkinci seferde kesinleştirmek gerekiyordu

birleştirmeden sonra kesinleştirme yapılmazsa aynı Hata gösterilecektir.

Benzersiz olmadan, her birleştirme işleminden sonra commit verilirse Sorgu çalışacaktır.


-1

Genel durumda ORA-30926 hatasını çözmek için DISTINCT kullanımına ilişkin daha fazla açıklama:

USING () yan tümcesi tarafından belirtilen veri kümesinin birleştirme sütunlarının , yani ON () yan tümcesindeki sütunların yinelenen değerleri olmadığından emin olmanız gerekir .

OP'nin USING cümlesinin sadece bir anahtar seçtiği örneğinde, USING cümlesine DISTINCT eklemek yeterliydi. Bununla birlikte, genel durumda, USING yan tümcesi, UPDATE ... SET yan tümcesinde kullanılmak üzere eşleşecek anahtar sütunların ve öznitelik sütunlarının bir kombinasyonunu seçebilir. Bu nedenle, genel durumda, USING yan tümcesine DISTINCT eklemek, aynı anahtarlar için farklı güncelleme satırlarına izin vermeye devam eder, bu durumda yine de ORA-30926 hatası alırsınız.

Bu, DCookie'nin cevabının ve Tagar'ın cevabındaki 3.1 numaralı noktanın detaylandırılmış halidir, benim deneyimlerime göre bu hemen açık olmayabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.