Oracle veri tabanında, sayısal veri içermesi beklenen karakter tipinde (CHAR,VARCHAR) alanlar sorun yaşamak için birebirdir. Örneğin müşteri numarası tutulan bir alana, servis ve grafik arayüz seviyesinde yeterli kontroller yapılmazsa müşteri adı, soyadı..vs gibi bilgiler yazılıyor olabilir 🙂 Bu alanda to_number() kullanarak bir sorgu yazdığınızda ve ya tabloyu bu alan üzerinden başka bir tablodaki nümerik bir alana bağlamak istediğinizde ORA-01722 hatası alırsınız.
Alanın yer aldığı tablodaki satırları düzeltmek için hangisinde hata olduğu bulmak da ayrı bir sorundur. Bunun için UPPER () ve LOWER () metotlarını kullanabilirsiniz. UPPER () ve LOWER () metotları numerik değerler için aynı, karakter değerleri için farklı sonucu vereceğinden, hatalı satırlara ulaşabilirsiniz. Diyelim ki tablomuzun adı MUSTERI, alanın adı MUSTERINO olsun:
CREATE TABLE MUSTERI
(
RECORDOID NUMBER(16) NOT NULL,
MUSTERINO VARCHAR(10) NOT NULL,
MUSTERIADI VARCHAR(10) NOT NULL
);
Tabloya bazı kayıtlar atalım:
Insert into MUSTERI
(RECORDOID, MUSTERINO, MUSTERIADI)
Values
(4, '!', 'aslan');
Insert into MUSTERI
(RECORDOID, MUSTERINO, MUSTERIADI)
Values
(3, '-', 'aslan');
Insert into MUSTERI
(RECORDOID, MUSTERINO, MUSTERIADI)
Values
(2, 'bogac', 'aslan');
Insert into MUSTERI
(RECORDOID, MUSTERINO, MUSTERIADI)
Values
(1, '100', 'bogac');
COMMIT;
Tabloyu yarattıktan sonra geçersiz değerler içeren satırları bulalım:
SELECT *
FROM MUSTERI M
WHERE UPPER(M.MUSTERINO) != LOWER(M.MUSTERINO)
Bu çözüm UPPER ve LOWER metotlarında aynı sonucu veren bazı diğer karakterler (“!”,”-” gibi) için yeterli olmayabilir, sadece bu karakterleri içeren satırlar olduğundan şüpheleniyorsanız ek sorgular yazmak gerekebilir. Sorunla Oracle veri tabanında karşılaşmış olsam da, diğer veri tabanı sistemleri için de çözüm olacağını düşünüyorum.
Kolay gelsin 🙂