Salı , 26 Nisan 2016
Anasayfa / MAKALELER / Veri Tabanı / PLSQL DE BİLİNEN CURSOR TİPLERİ VE KULLANIMI

PLSQL DE BİLİNEN CURSOR TİPLERİ VE KULLANIMI

Kullanımı Oracle Database’ ine ait olan cursor tipleridir. Bu tip cursor’ları kullanıcı(developer) lar aktif olarak kullanamazlar. Open/fetch/Close işlemi database tarafından ihtiyaç halinde

PLSQL DE BİLİNEN CURSOR TİPLERİ VE KULLANIMI
1)Implicit Cursor
Kullanımı Oracle Database’ ine ait olan cursor tipleridir. Bu tip cursor’ları kullanıcı(developer) lar aktif olarak kullanamazlar. Open/fetch/Close işlemi database tarafından ihtiyaç halinde gerçekleştirilir. Konuyu biraz detaylandırarak aşağıdaki şekile bir göz atalım :
                cursors
Oracle, kodun derleme işlemini temel olarak yukarıdaki mimari ile gerçekleştirir. Begin .. End arasında bulunan bir bloğun derlenmesi sırasında once Plsql engine çağrılarak Plsql kodu derlenmeye başlanır; kod içerisindeki sql cümlecikleri için ise SQL Engine çağrılarak sql cümleciğinin sonucu SQL engine tarafından PLSQL Engine’ e döndürülür. İşte bu sırada SQL işlemlerini gerçekleştirmek için implicit cursor’lar kullanılır. Örnek verilecek olursa basit bir update cümlesi için Oracle tarafında bir implicit cursor açılarak, işlemler bu cursor aracılığı ile gerçekleştirilir. Daha once de belirttiğimiz gibi developer bu açma kapama aşamasının dışındadır. Fakat cursorun bazı özelliklerini çağırabilir. Bunlar ;
                sql%rowcount-> %rowcount -> implicit cursor’da kaç satır olduğu bilgisi
                sql%notfound-> implicit cursor’da kayıt yok ise true döndürür
                sql%found  -> implicit cursor’da kayıt var ise true döndürür.
Küçük bir örnek verelim :
DECLARE
   v_cnt   NUMBER;
BEGIN
   UPDATE HR.employees e
      SETe.salary =e.salary +100
    WHEREe.department_id =50;
   v_cnt :=SQL%ROWCOUNT; — update işlemi sırasında kullanılan implicit cursorun satır sayısı
   DBMS_OUTPUT.put_line (v_cnt || ‘ rows updated.’);
END;
DBMS_OUTPUT :
45 rows updated.
2)Explicit Cursor
Kullanımı developer hakimiyetinde olan cursor tipleridir. Bu tip cursor’ lar kodu yazan kişi tarafından tanımlanır ve kullanılırlar. Aşağıdaki örneği inceleyelim :
DECLARE
   CURSOR c1 — cursor tanımı..
   IS
      SELECT *
        FROM hr.employees e
       WHEREe.department_id =100;
   r1   c1%ROWTYPE;— cursorun sakladığı datanın satır tipinde bir değişken tanımlanıyor..
BEGIN
   ifnot c1%isopen then— cursor kapalı konumda ise açılıyor. (closed konumdaysa içine erişilemez. “invalic cursor” hatası alınır.)
    open c1;
   endif;
   LOOP
      FETCH c1
       INTO r1;— cursor içindeki 6 adet kayıt, döngü içerisinde sırasıyka r1 değişkenine assign ediliyor.
      DBMS_OUTPUT.put_line (   r1.employee_id
                            || ‘ numarali personel : ‘
                            || r1.first_name
                           );
      EXITWHEN c1%NOTFOUND; — cursor artık kayıt kalmadığı zaman döngünden çıkılıyor.
   ENDLOOP;
   if c1%isopen then
    close c1;— cursor açık konumda ise kapatılyor.
   endif;
END;
DBMS_OUTPUT :
108 numarali personel : Nancy
109 numarali personel : Daniel
110 numarali personel : John
111 numarali personel : Ismael
112 numarali personel : Jose Manuel
113 numarali personel : Luis
113 numarali personel : Luis
Burada dikkat edilmesi gereken nokta, cursor’un open close edilmesidir. Açık bir cursor kapatılmadığı zaman şöyle bir hataya sebep olabilir : Aşağıda ilgili cursor ile ilgili başka bir işlem için yeni bir loop açıldığında cursor sıfırdan okunmaz. Örnek verecek olursak, yukarıdaki kod içinde 6 kaydın tamamını değil de 3. kayıttan sonra döngüden çıkıp cursor’u kapatmadan aşağıda yeni bir loop’ a girse idik cursor’ı baştan değil 3. satırdan itibaren okumaya devam edecekti.
Cursor’ ı Parametre ile Çağırmak
Yukardaki örneğimizde department_id si 100 olanlar için cursor tanımlamıştık. Bazı durumlarda bu filtrelerin dinamik olarak verilmesi gerekebilir. Bu gibi ihtiyaçlarda cursor’ı parametrik tanımlayarak kullanabiliriz. Yukardaki örneğin aynısını parametrik şekilde inceleyelim:
/* Formatted on 2011/08/08 00:26 (Formatter Plus v4.8.8) */
DECLARE
   CURSOR c1(p_id innumber)— id filtresi dışarıdan gelecek ..
   IS
      SELECT *
       FROM hr.employees e
       WHEREe.department_id = p_id;
   r1   c1%ROWTYPE;— cursorun sakladığı datanın satır tipinde bir değişken tanımlanıyor..
BEGIN
   ifnot c1%isopen then
    open c1(100); — cursor 100 parametresi ile çağrılıyor.
   endif;
   LOOP
      FETCH c1
       INTO r1;
      DBMS_OUTPUT.put_line (   r1.employee_id
                            || ‘ numarali personel : ‘
                            || r1.first_name
                           );
      EXITWHEN c1%NOTFOUND;
  ENDLOOP;
   if c1%isopen then
    close c1;
   endif;
END;
DBMS_OUTPUT :
108 numarali personel : Nancy
109 numarali personel : Daniel
110 numarali personel : John
111 numarali personel : Ismael
112 numarali personel : Jose Manuel
113 numarali personel : Luis
113 numarali personel : Luis
REF_CURSOR Kullanımı
Adı üzerinde referans cursor’lardır. İçeriği static olarak kodun başında değil ; dinamik olarak kodun içinde belirlenir. Aşağıdaki örnek olayı biraz daha netleştirecektir :
Önce cursor un farkını daha iyi anlayabilmemizi sağlaması açısından basit bir fonksiyon yazacağız; sonrasında fonksiyonu değişik parametrelerle çağırarak referans cursor mantığını inceleyeceğiz.
createorreplacefunctionf_ref_cur(p_num innumber)returnvarchar2is
    type type_c1 isrefcursor; — referans cursor tipi
    c1 type_c1;     — kullanılacak referans cursor değişkeni
    r1 HR.employees%rowtype;–referans cursor’ un satır tipi.
    v_last_name varchar2(20);
begin
    if p_num =1then
    open c1 for
    SELECT *
        FROM hr.employees e
       WHEREe.employee_id =100;
    elsif p_num =2then
    open c1 for
    SELECT *
        FROM hr.employees e
       WHEREe.employee_id =101;
    endif;
    loop
        fetch c1 into r1;
        exitwhen c1%notfound;
         v_last_name := r1.last_name;
    endloop;
    close c1;
    return v_last_name;
end;
Burada önemle dikkat etmemiz gereken bir nokta var. Cursor tanımlanırken direct olarak bir cursor nesnesi olarak değil ; bir type olarak tanımlanırlar. Yani referans cursor tipi şeklinde bir tanım yapılarak; bu tipte bir cursor tanımlanır. Örnekte göreceğimiz üzere once referans cursor olan type_c1adında bir tip tanımladık. Sonrasında ise type_c1 tipinde olan c1 nesnesini tanımladık. Yani burada type_c1 bir tip; c1ise kullanılacak olan değişken.
Fonksiyonun temel mantığı ;
Eğer fonksiyon
1 parametresi ile çağrılırsa 100 nolu personel select edilerek cursor doldurulacak;
2 parametresi ile çağrılırsa 101 nolu personel select edilerek cursor doldurulacak.
Sonrasında personelin soyad bilgisini döndürecek.
Şimdi fonksiyonumuzu iki ayrı parametre ile çağırarak sonuçları görelim :
declare
 v_lname varchar2(20);
begin
    v_lname :=f_ref_cur(1);
    DBMS_OUTPUT.put_line (v_lname);
end;
DBMS_OUTPUT :
King
declare
 v_lname varchar2(20);
begin
    v_lname :=f_ref_cur(2);
    DBMS_OUTPUT.put_line (v_lname);
end;
DBMS_OUTPUT :
Kochhar

Ercan Yazgan

Oracle Technologies Specialist Yalova Doğumluyum, İlköğretimimi İstanbulda, Lise eğitimini ise memleketim olan Gümüşhane'de Anadolu Lisesinde tamamladım. Lisans eğitimimi ise Sakarya Üniversitesinde, hayalim olan bilgisayar mühendisliğinde tamamladım. Üniversitedeyken kariyer hedefimi database teknolojileri üzerine belirledim ve Oracle ile projeler geliştirdim. Her zaman yeniye ve yeniliğe olan ilgimden dolayı lisans projemde ODI ve OBIEE teknolojilerini kullanarak veri ambarı sistemlerine giriş yaptım. Şu an özel bir şirkette PLSQL developer olarak çalışmaktayım. İlgi alanlarım ve bildiğim teknolojiler; PLSQL, Oracle forms/reports, Oracle Administration

Latest posts by Ercan Yazgan (see all)

Hakkında Ercan Yazgan

Oracle Technologies Specialist Yalova Doğumluyum, İlköğretimimi İstanbulda, Lise eğitimini ise memleketim olan Gümüşhane'de Anadolu Lisesinde tamamladım. Lisans eğitimimi ise Sakarya Üniversitesinde, hayalim olan bilgisayar mühendisliğinde tamamladım. Üniversitedeyken kariyer hedefimi database teknolojileri üzerine belirledim ve Oracle ile projeler geliştirdim. Her zaman yeniye ve yeniliğe olan ilgimden dolayı lisans projemde ODI ve OBIEE teknolojilerini kullanarak veri ambarı sistemlerine giriş yaptım. Şu an özel bir şirkette PLSQL developer olarak çalışmaktayım. İlgi alanlarım ve bildiğim teknolojiler; PLSQL, Oracle forms/reports, Oracle Administration

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*