5 Temmuz 2007 Perşembe

PLS_INTEGER VERİTİPİ

PLS_INTEGER veritipi, işaretli tamsayıları depolamak için kullanılır. Sınır değeleri -2^31 ile 2^31 'dir, NUMBER tipine göre bellekte daha az yer kaplar. PLS_INTEGER işlemleri makina aritmetiği kullanır, bu yüzden kütüphane aritmetiği kullanan NUMBER ve BINARY_INTEGER işlemlerinden daha hızlıdır. Verimlilik açısından sınır değerleri arasında kalan hesaplamalarda PLS_INTEGER veritipinin kullanılması daha uygundur.

PLS_INTEGER ve BINARY_INTEGER 'ın sınır değeleri aynı olduğu halde bu iki veritipi tamamen uyumlu değildir. PLS_INTEGER 'da hesaplamada bir taşma (overflow) olursa istisna (exception) verir. Bu taşma BINARY_INTEGER 'da olursa eğer sonuç bir NUMBER değişkenine atanmışsa istisna vermez.

Eski uygulamalarda uyumluluk açısından BINARY_INTEGER kullanılmaya devam edilebilir, yeni uygulamalarda ise PLS_INTEGER veritipinin kullanılması daha iyi bir performans sağlayacaktır.

3 Temmuz 2007 Salı

Karşılaştırma ve Koşul İfadelerinde NULL Değerleri

Şu kurallar önemlidir ve gözardı edilmemelidir:

1) Karşılaştırmalarda eğer herhangi bir değer NULL ise sonuç NULL çıkar.
2) NULL bir değere, NOT mantık operatörü uygulanırsa sonuç gene NULL 'dır.
3) Koşullu kontrol ifadelerinde eğer koşulun sonucu NULL ise bu koşula bağlı ifadeler işleme konulmaz.
4) CASE bildirimlerinde veya CASE ifadelerinde, ifadenin sonucu NULL ise, WHEN NULL kullanılarak bu durum belirlenemez. Bunun yerine WHEN ifade IS NULL kullanılmalıdır.

Aşağıdaki örnekte y'nin değeri NULL olduğundan IF karşılaştırmasının sonucu da NULL çıkacaktır ve karşılaştırmaya bağlı ifade işleme konmayacaktır.

x := 5;
y := NULL;
...
IF x != y THEN -- sonuç NULL çıkar yani TRUE değil
sequence_of_statements; -- işleme konmaz
END IF;

2 Temmuz 2007 Pazartesi

Kestirme Değerlendirme (Short-Circuit Evaluation)

PL/SQL 'de AND ve OR mantık operatörleri çalışırken belli durumlar için sadece ilk elemana bakarlar, ikinci elamanı göz ardı edip, değerlendirmezler, şöyle ki:
AND 'in TRUE döndürmesi için her iki elemanın da TRUE olması gerekir.

Eğer ilk eleman FALSE ise sonucun FALSE çıkacağı bellidir, bu durumda PL/SQL ikinci elemana hiç bakmayacaktır. OR için ise sonucun TRUE çıkması için iki elemanın sadece birinin TRUE olması yeterlidir. OR 'un ilk elemanı TRUE ise PL/SQL ikinci elemana hiç bakmayacaktır çünkü sonucun TRUE çıkacağı ilk elemandan bellidir.

PL/SQL 'in bu kestirme değerlendirme özelliğinden dolayı bazı hatalı yazımlarda hata mesajı ile karşılaşılmayabilir. Örneğin aşağıdaki örnekte OR operatörünün ikinci elemanında sıfıra bölme hatası olduğu halde bir hata mesajı alınmaz:

DECLARE
...
on_hand INTEGER;
on_order INTEGER;
BEGIN
...
IF (on_hand = 0) OR ((on_order / on_hand) < 5) THEN
...
END IF;
END;