ORA-01422: exact fetch returns more than requested number of rows
PL/SQL’de bir SELECT … INTO birden fazla satır döndürdü. WHERE koşulunu tekil hale getirin, bir satırı bilerek seçin ya da bir koleksiyona veya döngüye alın.
Ne anlama gelir?
Skaler değişkenlere yapılan SELECT … INTO yalnızca bir satır taşıyabilir. Sorgu iki ya da daha fazla satır döndürdüğünde PL/SQL önceden tanımlı TOO_MANY_ROWS istisnasını (ORA-01422) fırlatır. Çoğunlukla veri değişikliklerinin daha önce tekil olan bir aramayı belirsiz hale getirmesinden sonra ortaya çıkar.
Yaygın nedenler
- WHERE koşulunun tekil bir anahtar üzerinde olmaması.
- Kopya veri; örneğin tekil kısıtı olmayan bir yükleme sonrasında.
- Satırları çoğaltan eksik bir join koşulu.
- Test verisinde tekil olup üretimde tekil olmayan bir arama.
Nasıl çözülür?
- Tekil ya da birincil anahtar üzerinden filtreleyin.
- Birden fazla satır geçerliyse birini bilerek seçin:
ORDER BY … FETCH FIRST 1 ROW ONLY(12c ve sonrası). - Tüm satırlara ihtiyacınız varsa
BULK COLLECT INTOile bir koleksiyona ya da bir cursor döngüsüne alın. - Kopyaların hiç olmaması gerekiyorsa tekil bir kısıt ekleyin.
Örnek
En son satırı bilerek seçin (12c ve sonrası):
SELECT status INTO l_status
FROM order_history
WHERE order_id = p_id
ORDER BY changed_at DESC
FETCH FIRST 1 ROW ONLY;
SQLlightspeed’de
Bir ifade hata verdiğinde SQLlightspeed’in hata paneli, hata kodunu sade bir Türkçe açıklama ve ne yapmanız gerektiğine dair bir öneriyle; Oracle’ın kendi mesajı ve Oracle dokümantasyonuna bağlantıyla birlikte gösterir — bu hata ve sık görülen onlarca başka hata için.
İlgili hatalar
ORA-01403ORA-01427ORA-06502 Tüm Oracle hataları →
Oracle dokümantasyonu: ORA-01422. Oracle, Oracle Corporation’ın tescilli ticari markasıdır. SQLlightspeed’in Oracle ile bir bağlantısı yoktur.