ORA-01403: no data found
PL/SQL’de bir SELECT … INTO hiç satır döndürmedi (ya da kod, var olmayan bir associative array öğesini okudu). NO_DATA_FOUND istisnasını yakalayın ya da sorguyu “satır yok” sonucunu normal kabul edecek şekilde yazın.
Ne anlama gelir?
SELECT … INTO tam olarak bir satır döndürmelidir. Sıfır satırda PL/SQL önceden tanımlı NO_DATA_FOUND istisnasını (ORA-01403) fırlatır. Hiç atanmamış bir index-by tablo öğesini okuduğunuzda da aynı hata oluşur. Dikkat: SQL içinden çağrılan bir fonksiyon bu hatayı fırlatırsa SQL ifadesi hata yerine sessizce NULL alır.
Yaygın nedenler
- WHERE koşulu hiçbir satırla eşleşmedi — yanlış anahtar, silinmiş veri ya da farklı bir şema.
- Başka bir oturumun eklediği veri henüz commit edilmedi.
- Bir koleksiyonun hiç atanmamış bir indeksini
my_table(i)ile okumak. - Metin karşılaştırmasında büyük/küçük harf ya da sondaki boşluk farkı.
Nasıl çözülür?
- “Bulunamadı”nın beklendiği yerde yakalayın:
EXCEPTION WHEN NO_DATA_FOUND THEN …. - Ya da hiç oluşmamasını sağlayın:
MAX(kolon)gibi bir toplama fonksiyonu her zaman bir satır döndürür (eşleşme yoksa NULL). - Sıfır, bir ya da çok satırın hepsi geçerliyse bir cursor döngüsü kullanın.
- Koleksiyonlarda okumadan önce
my_table.EXISTS(i)ile kontrol edin.
Örnek
Boş durumu açıkça ele alın:
BEGIN
SELECT salary INTO l_salary FROM employees WHERE id = p_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
l_salary := NULL;
END;
Ya da hiç fırlatmayın:
SELECT MAX(salary) INTO l_salary FROM employees WHERE id = p_id;
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-01422ORA-06502ORA-01427 Tüm Oracle hataları →
Oracle dokümantasyonu: ORA-01403. Oracle, Oracle Corporation’ın tescilli ticari markasıdır. SQLlightspeed’in Oracle ile bir bağlantısı yoktur.