Üye Kayıt Üye Giriş

Conditional Compilation (Koşullu Derleme)


Conditional Compilation (Koşullu Derleme)

 

Bu makalemde “Conditional Compilation” ‘ın nasıl çalıştığını ve ne amaçla kullanabileceğimizi anlatmaya çalışacağım.

Önbilgiler: Bu makaleyi tam olarak anlayabilmek için

1-      Temel PL/SQL komutlarını (değişken tiplerini, atama ifadeleri, if-then-else vb)

2-      PL/SQL package, procedure ve function kavramlarını (temel düzeyde bilgi yeterlidir)

biliyor olmak gerekmektetir.

 

Malum Oracle her yeni versiyonu ile birlikte bir sürü yeni özellik gelmekte. Örneğin LOB tipleri Oracle 9i versiyonu ile birlikte geldi. LOB tipi gelmeden önce LONG ve RAW LONG tipleri kullanılmaktaydı ki artık kullanılmalarını önermiyoruz.

Not: bu makale LOB ve LONG tiplerini anlatmayacaktır.

Birkaç basit senaryo ile başlayalım:

Kurumsal bir şirkette pek çok farklı versiyonda Oracle database’i bulunabilir ve bu farklı versiyonlar üzerinde aynı sistemler çalışıyor olabilir. Genelde yeni bir database versiyonuna tüm sistemler aynı anda upgrade edilmezler. Bu geçişler uzun süreçler olabilir ve hatta kimi databaseler upgrade edilmeyebilir zira işin ucunda bir de maliyet kısmı mevcut.

Bunun gibi bir başka örnek de şu olabilir; bir yazılım firması elindeki yazılımı pek çok şirkete satabilir fakat müşterilerin çoğunun farklı database versiyon lisansları olabilir haliyle sizin yazılımınızın bu farklı Oracle Database versiyonlarda da çalışması gerekmektetir.

Bu noktada karşımıza şöyle bir sorun çıkıyor: örneğin tablolarınızda PL/SQL kodlarınızda LOB objeleri kullandıysanız, bu sizin oracle 9i den önceki bir versiyonda bu kodu çalıştıramayacağınız anlamına gelir.
Aynı şekilde database versiyonlarınız farklı olamasa bile Test sisteminizdeki bazı kodların (örneğin kodunuzu trace ettiğiniz kodlar, DBMS_OutPut gibi) Canlı sisteminizde olmasını istemeyeceksinizdir. Eğer 8 versiyonunda da çalışmasını sağlayacak şekilde tasarlamak istiyorsanız iki yol bulunmakta.

1-      Her database versiyonu (veya TEST ve CANLI sistem )için ayrı aynı PL/SQL kodu yazarsınız ki böylece yazılımınızın 9i versiyonu, 10g versiyonu, 11g versiyonu gibi farklı farklı scriptleri olacaktır ve sistemi kuracağınız database versiyonuna göre uygun scriptleri çalıştırırsınız.

2-      Conditional Compilation ( Koşullu Derleme )

Birinci yol oldukça masraflı bir iştir çünkü ola ki sistemde bir hata bulur ve düzeltmek isterseniz bunu elinizdeki bütün scriptlere tek tek uygulamak zorunda kalırsınız. Ayrıca unuttuğunuz kodlar da sonradan başınıza ciddi dertler açacaktır.

İşte Oracle bize bu durum için koşullu derleme yönetimini sunuyor. Yani kodumuzu yazarken her database’imize özel olarak çalışacak şekilde (farklı versiyonlar veya test ve canlı sistem arasındaki farklar) tasarlayabiliriz.
Bildiğiniz üzere yazdığımız PL/SQL kodları Oracle’ın PL/SQL engine yani PL/SQL motoru tarafından çalıştırılmaktadır. Koşullu derleme komutları bu noktadan önce çalışarak, PL/SQL derleyicimizin çalıştıracağı kodları belirler, verdiğimiz koşullara göre çalışmasını istemediğimiz kodları bizim kodumuzdan çıkarır. Yani temelde “şu koşul doğru değil ise bu kodu sistemden çıkar” dediğimiz bir yapıdır. Bir örnekle anlatmak gerekirse:

Create Or replace Procedure SP_X as

X $if DBMS_DB_VERSION.VERSION > 8 $Then

Clob;

$ELSE

LONG;

$END

begin

x := ‘Ben bir örneğim’;

end;

/

DBMS_DB_VERSION paketi şu an çalıştığınız database versiyonu hakkında bilgi barındıran bir pakettir. Gördüğünüz üzere aslında standart PL/SQL if-then-else komutundan neredeyse hiç farkı yok Conditional Compilation kodlarının, sadece başlarında $ işareti var ve $if komutu END if ile değil $END ile bitiyor.

Bu kodu incelediğimizde eğer database versiyonu 8 den büyük ise X değişkeni CLOB olarak, eğer bu koşul doğru değil yani database versiyonu 8 ve altında ise LONG tipinde bir değişken olarak tanımlanacaktır. Haliyle yukarıdaki kodu Oracle 11g versiyonunda ki bir database de çalıştırırsak sisteme derlenip çalışacak olan kod şu olacak:

Create Or replace Procedure SP_X as

X

Clob;

 

 

 

begin

x := ‘sdfsdf’;

end;

/

Gördüğünüz gibi kod PL/SQL e gitmeden önce $ ile başlayan kısımlar koddan tamamen çıkarılacak ve yerleri boşluk olarak kalıcak. Eğer kodu oracle 8i versiyonunda çalıştırırsak, sisteme derlenip konulacak olan kod şöyle olacak:

Create Or replace Procedure SP_X as

X

 

 

LONG;

 

begin

x := ‘sdfsdf’;

end;

/

Gördüğünüz gibi database de versiyona göre farklı kodlar çalışmış olacaktı fakat bu siz bu prosedürü yarattıktan sonra koduna baktığınızda $ komutlarının yani conditional compilation kodlarının çıkarılmış halini görmezsiniz. Siz gene ilk yazdığımız full kodunuzu görürsünüz ama arka planda çalışacak kod yukarıda belirttiğimiz kodlar gibi olacaktır. Arka planda derlenmiş asıl kodun halini görmek isterseniz şu kodu çalıştırabilirsiniz.

Set Serveroutput on
/*DBMS_OUTPUT çıktısı olarak sonucu bize verecek, Toad sqlDeveloper vs ile DBMS çıktılarını enable etmeniz gerekiyor.*/

Exec DBMS_PreProcessor.print_post_processed_source(‘PROCEDURE’, User, ‘SP_X’);
/*şu anki kullanıcı ile yukarıdaki procedure ı yarattığımızı varsayıyorum.*/

Burada dikkat edilmesi gereken şey, koşullu derleme komutlarında değişkenler kullanılamaz. Yani aşağıdaki kod size hata verecektir.

declare

X number ;

begin

x := 10;

 

$if x < 20 $then

dbms_output.put_line(‘X 20 den küçük’);

$end

end;

/

 

Çünkü X in değerine göre derleme yapmaya çalışıyor. Unutmayın koşullu derleme PL/SQL motorundan önce çalışır yani değişkenler daha tanımlı bile değiller. $if koşulunda sadece CONSTANT olarak tanımlanmış değişkenleri kullanabilirsiniz. Zaten DBMS_DB_VERSION paketindeki VERSION CONSTANT olarak tanımlanmış bir değişkendir aslında.

Bu örnekte koşullu derlemenin farklı versiyonlarda nasıl kullanılabileceğine dair basit bir kod yazdık. Şimdi de, test sistem ile canlı sistem arasında kod geçişleri ile ilgili bir kod yazalım.

Öncelikle database de tanımlı bir değişkenimiz mevcut, adı PLSQL_CCFLAGS. Bu aslında bizim kendimize sistem bazında değişken tanımlaması yapmamızı sağlayan bir değişken ör:

Alter system set PLSQL_CCFLAGS= ‘IS_TEST:TRUE’;

Bu komut bize sistemde IS_TEST isminde değeri TRUE olan bir değişken tanımlamayı sağladı. Bu değişkeni test sisteminde TRUE, canlı yani production sistemde de FALSE olarak set edeceğiz. Şimdi bu tanımladığımız değişkeni başına $$ (iki tane dolar) işareti koyarak kullanabiliriz:

Alter system set PLSQL_CCFLAGS= ‘IS_TEST:TRUE’;

 

declare

x Number;

y varchar2(80);

Begin

Select dummy into y from dual;

$if $$IS_TEST $then

DBMS_Output.put_Line(‘Select Çalıştı, şimdi X e değer atanacak.’);

$end

x := length(y);

end;

/

Artık bu kod, test sistemindeyken bize DBMS_OUTPUT çıktımızı verecek fakat canlı sistemde vermeyecek. Yazılımcı arkadaşların çok sık kullandığı bir debug yöntemidir DBMS_OutPut. Haliyle test sistemlerinde bu çıktıları alarak kodun nerede hatalı çalıştığını bulmaya çalışırız fakat canlı sistemlerde de DBMS_OUTPUT ları hiç sevmeyiz zira gereksiz yere sistemimizi yavaşlatırlar.

Bunların dışında bir de $ERROR “HATA MESAJI” $END şeklinde bir komut daha mevcuttur. Bu da sizin belirli koşulları kontrol ettikten sonra eğer o sistemde kodunuzun çalışmasını istemiyorsanız hata alarak işlemin iptal edilmesini sağlar.

Create Or replace Procedure SP_X as

X $if DBMS_DB_VERSION.VERSION > 8 $Then

Clob;

$ELSIF DBMS_DB_VERSION.VERSION = 8 $Then

LONG;

$ELSE

$Error ‘DATABASE VERSIYONU EN AZ 8 OLMALIDIR’ $end

$END

begin

x := ‘Ben bir örneğim’;

end;

/

İlk örneğimizi biraz daha geliştirerek, eğer database versiyonu 8 in üzerinde ise CLOB, versiyon 8 ise LONG ama onun öncesi versiyonlarda da çalışmamasını sağlamış olduk.

Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

Yorum Yapabilmek İçin Üye Girişi Yapmanız Gerekmektedir.

ETİKETLER