PL/SQL Cursor

Oracle PL/SQL ile veriler üzerinde ekleme, seçme, güncelleme ve silme işlemleri sırasında kullanılan cursor hakkında bilgiler yer alıyor.

Cursor

Select, Insert, Update ve Delete gibi işlemler sırasında aktif kayıt alanını işaret yapı cursor olarak adlandırılır.

Oracle ile bir tablo içerisinde yer alan veriler listelendiğinde cursor sayesinde veriler satır satır okunarak işlem yapılır.

Cursor içerisinde yer alan çeşitli değerler kullanılarak tablonun sonuna gelip gelmediği, verinin olup olmadığı ile ilgili bilgiler alınır.

Cursor yapısı Implicit ve Explicit olmak üzere ikiye ayrılır.

Implicit

Veritabanı sorguları yapıldığında oracle tarafından oluşturulan ve yönetilen cursor Implicit olarak adlandırılır.

BEGIN
    INSERT ALL
        INTO TABLO(SUTUN1, SUTUN2, ...) VALUES('DEĞER1', 'DEĞER2', ...)
        INTO TABLO(SUTUN1, SUTUN2, ...) VALUES('DEĞER1', 'DEĞER2', ...)
    SELECT * FROM DUAL;
    DBMS_OUTPUT.put_line(SQL%ROWCOUNT);
    --DBMS_OUTPUT.put_line(sql%FOUND);
    --DBMS_OUTPUT.put_line(SQL%NOTFOUND);
    --DBMS_OUTPUT.put_line(SQL%ISOPEN);
END;

SELECT, INSERT, UPDATE ve DELETE işlemlerinde SQL isminde cursor açarak ROWCOUNT, FOUND, NOTFOUND, ISOPEN değişkenlerine değer atar.

Explicit

Explicit cursor tanımlanarak veriler üzerinde daha fazla kontrol imkanı sağlanır.

CURSOR tanımlaması aşağıdaki gibi yapılır.

CURSOR cursor_adi IS sorgu;

Örnek cursor tanımlaması aşağıdaki gibi yapılır.

CURSOR LISTELE IS SELECT * FROM TABLO_ADI;

Cursor tanımlandıktan sonra OPEN anahtar kelimesi ile işlem açık hale getirilir.

OPEN cursor_adi;
OPEN LISTELE;

Cursor işlemi açık hale getirildikten sonra FETCH ile değerler alınır.

FETCH cursor_adi INTO degisken_1, degisken_2;
FETCH LISTELE INTO degisken_1, degisken_2;

İşlem tamamlandıktan sonra cursor CLOSE ile kapatılır.

CLOSE cursor_adi;

Örnek Cursor kullanımı aşağıda yer almaktadır.

DECLARE
    fırst_name contacts.fırst_name%type;
    last_name contacts.last_name%type;
    email contacts.emaıl%type;
    CURSOR LISTELE IS
        SELECT first_name, last_name, email FROM contacts;
BEGIN
    OPEN LISTELE;

    LOOP
        FETCH LISTELE INTO first_name, last_name, email;
            IF fırst_name = 'Jaleesa' THEN
                EXIT;
            END IF;
            DBMS_OUTPUT.put_line(first_name || ' - ' || last_name || ' - ' || email);
        EXIT WHEN LISTELE%NOTFOUND;
    END LOOP;

    CLOSE LISTELE;
END;

DECLARE alanında kullanılacak değişkenler tablo veri tipine göre oluşturulmuştur.

CURSOR ile cursor ve sorgu oluşturulmuş BEGIN içerisinde cursor açılmış, LOOP ve FETCH ile sorgu adım adım çalıştırılmıştır.

FETCH bloğu içerisinde IF ile cursor ile alınan değer karşılaştırılmıştır.

BEGIN bloğunun sonunda ise cursor kapatılarak bellek iadesi yapılmıştır.

Cursor sayesinde veriler üzerinde adım adım PL/SQL komutlarını çalıştırma imkanı elde etmiş olduk.

PL/SQL Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!