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;

30 Haziran 2007 Cumartesi

Ayrılmış Sözcükler (Reserved Words)

Bazı sözcükler PL/SQL'de ayrılmış (reserved) oldukları halde SQL'de ayrılmış olmayabilirler. Örneğin CREATE TABLE (tablo yarat) ifadesinde, bir veritabanı kolonunu adlandırmak için, PL/SQL'de ayrılmış bir sözcük olan TYPE 'ın kullanıldığını düşünelim.

Bir SQL ifadesi, programımızdaki bu kolona (TYPE) atıfta bulunursa, bir derleme hatası oluşur; şu komutta olduğu gibi:

SELECT acct, type, bal INTO ... ----> derleme hatası

Ancak kolon adı (TYPE) çift tırnak içine alınırsa bu derleme hatası önlenebilir:

SELECT acct, "TYPE", bal INTO ... ----> hata vermez

Ancak tırnak içinde yazılan kısmın kolon adıyla tamamen aynı olması gerekir; "type" veya "Type" gene derleme hatasına yol açar.

İkinci bir seçenek olarak, sorunlu kolonu yeniden adlandıran bir görüntü (view) oluşturulabilir, sonra da bu görüntü SQL ifadelerindeki temel tablo'nun (base table) yerine kullanılabilir.

29 Haziran 2007 Cuma

Belirleyiciler (Identifiers)

Belirleyiciler PL/SQL program öğe ve birimlerini adlandırmada kullanılır; sabitler, değişkenler, istisnalar, kürsörler, kürsör değişkenleri, altprogramlar ve paketler gibi. Belirleyiciler en fazla 30 karakter uzunluğunda olabilirler.

BEGIN , END , CLOSE , DO , ARRAY , BODY , CURSOR , MAX , MIN gibi ayrılmış sözcükler (reserved words) belirleyici olarak kullanılamazlar.

Belirleyiciler, büyük-küçük harf farkına duyarlı değildir; bundan dolayı lastname, LastName ve LASTNAME'in üçü de aynı belirleyiciyi gösterecektir. Belirleyicilerin adlandırılmasında dolar işareti, numara işareti ve altçizginin kullanımına izin verilmiştir, bundan dolayı şunlar geçerlidir:

X , t2 , phone# , credit_limit , LastName , oracle$number , money$$$tree , SN## , try_again_

Ancak belirleyicilerde kısa çizgi, slash, ampersand ve boşluk kullanımına izin verilmez, bundan dolayı şunlar geçersizdir:

mine&yours , debit-amount , on/off , user id

28 Haziran 2007 Perşembe

Sayıların Bilimsel Gösterimi (Scientific Notation)

Sayıların bilimsel gösteriminde üs anlamına gelen Exponent sözcüğünün baş harfi olan E kullanılır. E, sayının yanına kaç tane sıfır geleceğini gösterir. Örneğin:

2E3 sayısı 2000 anlamına gelir. 3.141E2 ise 314.1 anlamına gelir.
3.1415E0 ise 3.1415 anlamına gelir. -3E2 ise -300 'dür.

E'den sonra bir eksi işareti geliyorsa, eksiden sonraki sayı kadar virgül sola kaydırılır. Örneğin:

4E-2 = 0.04'tür. 6E-4 = 0.0006'dır. -7.5E-2 = -0.075'dir.

PL/SQL'de üslü sayılar 1E-130 ile 10E125 arasında sınırlandırılmıştır. Bundan daha büyük ve daha küçük sayılar derleme hatasına neden olur. Örneğin bir sayıya 10E128 veya 1E-132 atanması derleme hatasına neden olacaktır.

27 Haziran 2007 Çarşamba

%TYPE Niteliği

PL/SQL değişkenlerinin ve kürsörlerinin nitelikleri (attribute) vardır. Bu nitelikler sayesinde bir öğenin tanımını tekrarlamadan o öğenin yapısına ve veritipine atıfta bulunulabilir. Veritabanı kolonları ve tabloları da benzer niteliklere sahiptir, bunlar bakım işlemlerinin kolaylaştırılmasında kullanılabilir. Yüzde işareti (%) niteliği göstermede kullanılır.

%TYPE niteliği bir değişkenin veya bir veritabanı kolonunun veritipini döndürür. Bu özellikle veritabanı değerlerini tutacak değişkenlerin tanımlanmasında kullanışlıdır. Örneğin books adlı bir tablonun title adlı kolonunun tipinde bir değişken tanımlamak için aşağıdaki komut kullanılabilir:

my_title books.title%TYPE;

Bu şekilde yeni oluşturulan my_title değişkeni title kolonunun tipinde olacaktır. İlerde veritabanında title kolonunun tipi değiştirilirse my_title değişkeni de otomatik olarak değişecektir.