Başlangıç > Database, Oracle, PL/SQL > pl/sql de execute immediate ve using kullanımı

pl/sql de execute immediate ve using kullanımı


Merhabaimmediate
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.

  1. gokhan
    16 Ekim 2014, 16:08

    Cok güzel anlatmışsın. Tebrikler

    Beğen

  1. No trackbacks yet.

Yorum bırakın

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.