pl/sql de execute immediate ve using kullanımı
Merhaba
Yazdığımız programlarda bazı durumlar için dinamik çalışmasını istediğimiz kodlar olur. Bu gibi durumlarda çeşitli çözümler bulunabilinir. Örnek olarak execute immediate bu zamanlarda bizim için çözüm olabilir. Bu yapı dışarıdan parametre alır ve dışarıya da değer verebilir.Bunun için ise execute immediate ile birlikte using işlemini kullanırız. Execute immediate statik ya da dinamik olarak oluşan bir sql ifadesini çalıştırır.Bu bir sorgu ya da bir progam çalıştıran script olabilir. Şimdi execute immediate örneklerine bakalım.
declare vString varchar2(300); begin --Normal şekilde kullanılan bir işlem. begin dbms_output.put_line('normal çalışan output işlemi'); end; --Execute immediate için hazırlanan string kod. vString := 'begin dbms_output.put_line(''execute immediate ile çalışan output.''); end;'; --Statik ya da dinamik olarak hazırlanan string ifadeyi bu şekilde çalıştırabiliriz. execute immediate vString; end;
Yukarıdaki örnek işlemin sonucunda oluşan çıktımız.
normal çalışan output işlemi execute immediate ile çalışan output.
Görüldüğü gibi hiçbir şekilde dışarıdan parametre vermedik ve dışarıya bir değer almadan işlemimizi yaptık. Artık using kullanıp oluşan kodumuza parametre gönderelim ve dışarıya da değer alalım. Bunun için aşağıdaki sorgumuzu execute immediate ile çalıştıralım ve salary alanını parametre olarak bir gönderelim.
select count(1) from hr.employees where salary < 3000 and job_id in ('PU_CLERK', 'ST_CLERK');
Yukarıdaki sql bize ücretin 3000 değerinden küçük olan kişi sayısını verir. Bu sorguyu execute immediate ve using kullanıp aşağıdaki gibi değiştirebiliriz. Bu sayede yazdığınız kodlarda dinamik bir işlem yapacağınızda bu yöntemi kullanabilirsiniz.
declare vSorgu varchar2(1000); vKisi number; vUcret number; begin vUcret := 3000; vSorgu := 'select count(1) into :vKisi from hr.employees where salary < :vUcret and job_id in (''PU_CLERK'', ''ST_CLERK'')'; execute immediate vSorgu into vKisi using vUcret; dbms_output.put_line(vKisi || ' kişinin ücreti ' || vUcret || ' değerinden küçük'); end;
Script çalıştığında bize vereceği çıktı “17 kişinin ücreti 3000 değerinden küçük” gibi bir değer olacaktır. Bu yöntem ile birden fazla değeri içeri gönderip ya da çıktı olarak alabiliriz. Execute immediate ve using kullanımında parametreler sırası ile into ve using satırındaki değerler ile eşleştirilir. Dinamik kod içindeki : işaretine sahip değerler into kelimesinden sonrasıra sırası ile execute immediate ifadesindeki into kelimesinden sonraki sırada değişkenlere atanır. Aynı şekilde kod içinde : ifadesine sahi değerler sırası ile using kelimesinden sonraki değerleri alır. Daha iyi anlaşılması için yukarıdaki kod bloğunu aşağıdaki gibi değiştirelim ve sonuçlarına bakalım.
declare vSorgu varchar2(1000); vKisi number; vUcret number; vMinUcret number; vMaxUcret number; begin vUcret := 3000; vSorgu := 'select count(1), min(salary), max(salary) into :vKisi, :vMinUcret, :vMaxUcret from hr.employees where salary < :vUcret and job_id in (''PU_CLERK'', ''ST_CLERK'')'; execute immediate vSorgu into vKisi, vMinUcret, vMaxUcret using vUcret; dbms_output.put_line(vKisi || ' kişinin ücreti ' || vUcret || ' değerinden küçük. En az ücret:' || vMinUcret || ' en çok ücret:' || vMaxUcret); end;
Son hali ile yukarıdaki kod çalıştığında ise bize “17 kişinin ücreti 3000 değerinden küçük. En az ücret:2100 en çok ücret:2900” şeklinde bir sonuç verecektir. Kod içindeki into kısmına baktığınızda kullanımın nasıl oldğunu göreceksiniz ve bu işlemi aynı yöntem ile using satırında da kullanabilirsiniz. Kodlarımızda using kullanıp herhangi bir fonksiyonel işlem yaptığımızda da out parametre olarak değer alabiliriz. Örnek olarak sysdate değerini execute immediate ve using kullanıp çıktı olarak yazdıralım.
declare vSorgu varchar2(1000); vTarih varchar2(20); begin vSorgu := 'begin :vTarih := to_char(sysdate,''dd/mm/yyyy hh24:mi:ss''); end;'; execute immediate vSorgu using out vTarih; dbms_output.put_line(vTarih); end;
Yukarıda olduğu gibi using out ifadesi ile kodumuzun içindeki değeri dışarıya alabiliriz. Bu kod çalıştığında da çıktımız “14/06/2014 20:35:32” şeklinde olacaktır.
Kolay gelsin.
Cok güzel anlatmışsın. Tebrikler
BeğenBeğen