Ben 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';
Tablo_1i çalıştırdım, veri var ve ayrıca içerideki sorguyu (
src`) çalıştırdım, o da veri var.
Bu hata neden gelir ve nasıl çözülebilir?
Bu genellikle USING cümlesinde belirtilen sorgudaki yinelemelerden 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 bir DISTINCT kullanarak sorunu hızlı bir şekilde çözebilirsiniz (aslında, 'Y' sabit bir değer ise, sorguya koymanıza bile gerek yoktur).
Sorgunuzun doğru olduğunu varsayarsak (tablolarınızı bilmiyorum) şö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';
Muhtemelen hedef tablonun aynı satırını birden çok kez güncellemeye çalışıyorsunuz. Az önce geliştirdiğim bir birleştirme deyiminde aynı sorunla karşılaştım. Güncellemenizin, birleştirme işleminin yürütülmesi sırasında aynı kayda birden fazla kez dokunmadığından emin olun.
ORA-30926 Hataları Nasıl Giderilir? (Doküman Kimliği 471956.1)
alter session set events '30926 trace name errorstack level 3';
veya
alter system set events '30926 trace name errorstack off';
ve oluştuğunda UDUMP'ta .trc dosyalarını izleyin.
3.1) SQL ifadesi bir MERGE mi? Birleştirmede yinelenen değerler olmadığından emin olmak için USING cümlesi tarafından döndürülen verileri değerlendirin. Birleştirme ifadesini deterministik bir where cümlesi içerecek şekilde değiştirin
3.2) Bu bir görünüm üzerinden bir UPDATE deyimi mi? Eğer öyleyse, görünüm sonucunu bir tabloya doldurmayı ve tabloyu doğrudan güncellemeyi deneyin.
3.3) Tablo üzerinde bir tetikleyici var mı? Hala başarısız olup olmadığını görmek için devre dışı bırakmayı deneyin.
3.4) Deyim bir 'IN-Subquery' içinde birleştirilemez bir görünüm içeriyor mu? Bu, sorguda "FOR UPDATE" cümlesi varsa yinelenen satırların döndürülmesine neden olabilir. 2681037 numaralı hataya bakın
3.5) Tabloda kullanılmayan sütunlar var mı? Bunları bırakmak hatayı önleyebilir.