Adem KALIN – Yazılım Mühendisi

Oracle CASE Yapısının SELECT Dışında Kullanımı

Bugün, geniş kullanıma sahip CASE yapısının çok bilinmediğini düşündüğüm bir özelliğinden bahsetmek istiyorum.

Bilindiği üzere CASE ifadeleri bir koşula göre dallanan ve tek bir sonuca yönlendiren yapılardır. If-Then-Else e benzese de çok sayıda karşılaştırmanın bulunduğu durumlarda çok daha anlaşılır olmakla birlikte, If-Then-Else yapısına göre daha performanslı çalışmaktadır. Bunun sebebi, If yapısında koşullar ilk If ifadesinden itibaren tek tek kontrol edilerek, ilgili şart sağlanana kadar devam edilir. Ancak Case ifadesinde yalnızca ve direkt olarak karşılaştırma koşulunun uyduğu dallanmadan devam edilir.

Case ifadelerini kod bloğumuzda genellikle SELECT ifadeleri içerisinde kullanırız. Buna örnek olarak aşağıdaki PL/SQL bloğunu gösterebiliriz en basit haliyle.

1
2
3
4
5
6
7
Select Case a.Secim
          When 1 Then '1'
          When 2 Then '2'
          When 3 Then '3'
          Else '9999'
       End As Secim
  From TableA a;

Bir de bunun dışında, gördüğüm/incelediğim bu zamana kadar yazılmış kodlardan anladığım kadarıyla çok da bilinmeyen bir şekilde, direkt karar yapısı olarak SELECT ifadeleri dışında da kullanabilmekteyiz CASE yapısını. Bu kullanım durumunda If-Then-Else seçimli yapısındaki gibi, belli şartlarda belli atamaları veya belli lojikleri kolaylıkla gerçekleştirebilmekteyiz. Üstelik, ilk seçenekte görüleceği üzere bir kolon değerinin seçimi için kullandığımızdan dolayı tek bir değer dönen bir yapı kurmamız gerekirken, SELECT dışında kullandığımız durumda bu zorunluluk kalmamakta ve aynen If-Then-Else yapısındaki gibi her bir WHEN-THEN bloğu içerisinde karmaşık lojikleri çalıştırabilmekteyiz.

Syntax olarak ise aralarında tek bir fark bulunuyor. Select ifadesi içerisinde bir kolonu CASE….END ile alabiliyoruz ancak tek başına kullanırken CASE….END CASE; ile komutu bitirmemiz gerekiyor. (Aşağıdaki örnek kodu incelediğinizde daha anlaşılır olacaktır.)

1
2
3
4
5
6
Case [...]
   When [...] Then [....]
   When [...] Then [....]
   When [...] Then [....]
   Else [....]
End Case;

Case yapısı ve koşulları ihtiyacınıza göre iki farklı şekilde tasarlanabiliyor.

İlk seçenek için karşılaştırılacak tek bir değer olması gerekiyor. Karşılaştırılması istenen değer hemen CASE keyword ‘ünün yanına yazılıyor ve bununla karşılaştırılacak ve EŞİT olması durumunda dallanılması gereken değer ise WHEN in yanına yazılıyor. Bu durumda özet olarak [Karsilastirma_Degeri] = [deger_n] eşleştirmesinin TRUE sonuç verdiği koşula dallanılır. Hiç uyan bir durum olmazsa da ELSE kısmına dallanılır.

1
2
3
4
5
6
Case [Karsilastirma_Degeri]
   When [deger_1] Then [....]
   When [deger_2] Then [....]
   When [deger_3] Then [....]
   Else [....]
End Case;

İkinci seçenekte ise daha karmaşık lojikler kullanabiliyoruz. Bu durumda WHEN Keyword ‘ünün yanına boolean sonuç dönecek şartları, eşitlikleri yazmamız gerekiyor. Bu şartların sayısı 1 veya daha fazla olabiliyor. Eğer birden fazla durum için karşılaştırma yapılacaksa AND veya OR gibi mantıksal operatörler kullanmamız gerekiyor.

1
2
3
4
5
6
Case 
   When [Karsilastirma_Ifadesi_1 AND Karsilastirma_Ifadesi_2] Then [....]
   When [Karsilastirma_Ifadesi_3 OR Karsilastirma_Ifadesi_4] Then [....]
   When [Karsilastirma_Ifadesi_5] Then [....]
   Else [....] 
End Case;

Case ifadesini kullanırken dikkat etmemiz gereken belki de en önemli husus, ya MUTLAKA BÜTÜN İHTİMALLERin karılığını yazmamız yada MUTLAKA ELSE bloğunu eklememiz gerekiyor olmasıdır. Eğer bu durumu karşılamazsanız, kodunuz sorunsuz compile olacak, ancak run-time ‘da karşılığı bulunamayan bir durum oluştuğunda ORA-06592 kodu ve CASE not found while executing CASE statement açıklamasıyla bir Oracle Exception fırlatılacaktır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir