ORA-01722: invalid number
Oracle bir karakter değerini sayıya çevirmeye çalıştı ve metin geçerli bir sayı değildi. Çoğunlukla bir VARCHAR2 kolon bir sayıyla karşılaştırılıyordur; bu yüzden tablodaki tek bir hatalı satır bütün sorguyu bozar.
Ne anlama gelir?
Bir ifadede metin ile sayı karşılaştığında Oracle metni sayıya çevirir. Değerlerden biri sayısal değilse — harfler, yanlış yerde boşluk, oturumun nokta beklediği yerde virgül — dönüşüm ORA-01722 ile başarısız olur. Satırların ve koşulların değerlendirilme sırası yürütme planıyla değişebildiği için bir sorgu aylarca çalışıp sonra patlayabilir.
Yaygın nedenler
- Bir VARCHAR2 kolonu sayısal bir değerle karşılaştırmak:
WHERE kod = 123. - Çoğunlukla sayı tutan ama bazı satırlarında metin bulunan bir kolon.
- Ondalık ayracın oturumun NLS ayarlarıyla uyuşmaması (Türkçe ayarlarda ondalık ayraç virgüldür).
- NUMBER bir kolona metin eklemek.
Nasıl çözülür?
- Aynı türleri karşılaştırın: kolon metinse
WHERE kod = '123'. - Hatalı değerleri bulun:
WHERE VALIDATE_CONVERSION(kolon AS NUMBER) = 0(Oracle 12.2 ve sonrası). - Güvenli çevirin:
TO_NUMBER(kolon DEFAULT NULL ON CONVERSION ERROR)(12.2 ve sonrası). - Çevirirken biçimi açıkça belirtin:
TO_NUMBER('1,5', '9D9', 'NLS_NUMERIC_CHARACTERS='',.''').
Örnek
Sayı olmayan satırları bulun (12.2 ve sonrası):
SELECT id, code
FROM products
WHERE VALIDATE_CONVERSION(code AS NUMBER) = 0;
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-06502ORA-12899ORA-01400 Tüm Oracle hataları →
Oracle dokümantasyonu: ORA-01722. Oracle, Oracle Corporation’ın tescilli ticari markasıdır. SQLlightspeed’in Oracle ile bir bağlantısı yoktur.