Bu Kategoriye İçerik Girin veya Soru Sorun

Kategori İçi Sözlük

Bu Sayfayı Paylaş:

Cursor

Tanım: İlişkisel veritabanı sistemlerinde , seçim sonucu alınan kayıtlar üzerinde gezinmeyi sağlayan yapı. Genel olarak cursor declare edilir, kullanıma başlarken açılır (open), her kayıt değişkenlere atanır (fetch) ve tüm kayıtlar gezildikten sonra kapatılır (close)

Implicit Cursor

Tanım: Oracle'da cursor'ın kod ile tanımlanmadığı, çalıştırma sırasında otomatik sistem tarafından oluşturulan cursor tipi. Örneğin select into yapısı veya for loop bir implicit cursor örneğidir

Explicit Cursor

Tanım: Oracle'da cursor'ın programcı tarafından kod içinde tanımlandığı ve kontrolünü yaptığı cursor. CURSOR cursor_adi IS select_yapisi şeklinde tanımlanır

Implicit ve Explicit Cursor

Oracle'da cursor iki çeşit olduğu belirtilir:
  • Implicit Cursor : Cursor'ın kod ile tanımlanmadığı, çalıştırma sırasında otomatik sistem tarafından oluşturulan cursor. Örneğin select into yapısı veya for loop bir implicit cursor örneğidir
  • Explicit Cursor : Cursor'ın programcı tarafından kod içinde tanımlandığı ve kontrolünü yaptığı cursor. CURSOR cursor_adi IS select_yapisi şeklinde tanımlanır.

Implicit Cursor Özellikleri

Implicit Cursor Özellikleri (Implicit Cursor Attributes) cursor çalıştıktan sonra bilgi almak için kullanılan özelliklerdir. Bu özellikler aşağıdaki gibidir:
  • %FOUND : select into için bir veya daha fazla kayıt döndürdüyse, insert, update ve delete işleminden bir veya daha fazla kayıt etkilendiyse true değerini alır.
  • %NOTFOUND : select into için hiç kayıt dönmedi ise, insert, update ve delete işleminden hiç bir kayıt etkilenmediyse true değerini alır
  • %ROWCOUNT : select into ile dönen kayıt sayısı, insert, update ve delete işlemlerinde etkilenen kayıt sayısıdır
  • %ISOPEN : Implicit Cursor'da her zaman false'dur. Çünkü çalışma tamamlandıktan sonra cursor zaten kapatılmış olacaktır

%FOUND %NOTFOUND ve %ROWCOUNT Kullanılan Basit Bir Örnek

Aşağıdaki örnekte bir update işlemi yapılmakta ve update işleminin durumuna göre ouput'a bilgi basılmaktadır :
declare
affected number(2);
begin
update employees set salary=salary+10 where employee_id=100;
IF SQL%FOUND THEN
    affected:=SQL%ROWCOUNT;
    dbms_output.put_line('updated : ' || affected);
ELSIF SQL%NOTFOUND THEN
     dbms_output.put_line('not updated');
END IF;
end;
/

update işlemi çalıştıktan sonra herhangi bir kayıt etkilenmiş ise SQL%FOUND ifadesi true döndürür ve SQL%ROWCOUNT ile etkilenen kayıt sayısı alınabilir. Eğer etkilenen kayıt yok ise SQL%FOUND false ve SQL%NOTFOUND true döndürür.

Bir Tablo Satırların Bilgilerini Cursor ile Output'a Basan Örnek

Aşağıdaki örnek, employees tablosundaki satırların ad ve soyadlarını birleştirip output'a basmaktadır. Cursor kullanılmakadır.
declare
    cursor c1 is select * from employees;
    v_employees employees%ROWTYPE;        
begin
    open c1;
    loop
        fetch c1 into v_employees;        
    exit when c1%NOTFOUND;
        dbms_output.put_line(v_employees.first_name || ' ' || v_employees.last_name);
    end loop;
    close c1;
end;
/
Declare bölümünde c1 cursor'u tanımlanmıştır ve tüm employees tablosu alınmaktadır. v_employees ise bir employees satırını tutacak değişkendir (bu değişkene fetch edilecektir). Kod bölümünde önce open c1 şeklinde cursor açılır ve satırlar loop için v_employees değişkenine fetch c1 into v_employees ile doldurulur (fetch). Eğer satır var ise oputput'a ad soyad basılır. Loop sonunca cursor kapatılmalıdır.
Tüm satırı almak yerine sadece ad ve soyad bilgileri alınabilir. Aşağıdaki örnek bunu yapmaktadır:
declare
    cursor c1 is select first_name,last_name from employees;
    v_firstname  employees.first_name%TYPE;
    v_lastname  employees.last_name%TYPE;       
begin
    open c1;
    loop
        fetch c1 into v_firstname,v_lastname;        
    exit when c1%NOTFOUND;
        dbms_output.put_line(v_firstname || ' ' || v_lastname);
    end loop;
    close c1;
end;
/

Bu örnekte tüm satırın bir değişkene atanması yerine sadece kullanılan değerler atanmıştır.



Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir