Bu yazıda Oracle da prosedür içerisinden SYS_REFCURSOR doldurup bu CURSOR içerisindeki her satıra tek tek erişerek ekrana basma işlemi yapacağız.
Bir tablodaki kayıt ile ilişkili başka bir tabloda birden fazla kayıt bulunabilir (1 – n ilişki) ve siz alt tabloda üst tablonun id si olan kayıtları göstermek isteyebilirsiniz
Tablolar arasındaki ilişki gözüküyor.
Prosedurümüz üst kısmında gerekli tanımlamaları yapıyoruz.
RC_CURSOR SYS_REFCURSOR; –cursor tanımlaması
TALEP_ID NUMBER; –silinecek üst id
TALEP_BIRIM_ID NUMBER; — cursordan gelen her bir değerin atılacağı değişken (temp gibi)
TALEP_ID:=1;
CURSOR açıyoruz ve içeriğini dolduruyoruz .
Cursor doldurma işlemi klasik bir select cümleciğiyle yapılabilir.
Dışarıdan gelen parametreleri de bu cümlecik içerisinde kullanabilirsiniz.
OPEN RC_CURSOR
FOR SELECT NTALEP_BIRIM_ID
FROM ITS_HRK_TALEP_BIRIM
WHERE NTALEP_ID = TALEP_ID ;
Listeleyeceğimiz dataları cursor içerisine aldıktan sonra bir döngü yardımıyla cursor içerisindeki değerlere tek tek erişeceğiz.
Buradaki döngü programlama dillerinde var olan dongülerle aynı mantık içerisinde çalışmaktadır.
Düngü LOOP ile başlar ve END LOOP ile biter.
FETCH ifadesiyle cursor içerisindeki ilk değeri temp değişkenimiz olan TALEP_BIRIM_ID içerisine atıyoruz.
Burada bizim döngüden çıkmamızı sağlayacak ifade ise RC_CURSOR%NOTFOUND ifadesidir.
Bu ifade TRUE döndüğü anda CURSOR içerisinde eleman kalmamış demektir ve döngüden çıkılır.
DBMS_OUTPUT.PUT_LINE(TALEP_BIRIM_ID) ifadesi ise temp değişkenimizin değerini ekrana basar tabi bu değeri görebilmeniz için DBMS_OUTPUT ‘u Toad üzerinden enable etmeniz gerek.
DBMS_OUTPUT.PUT_LINE sadece bir örnek bu kısımda CURSOR içerisinde sakladığınız verilerle her türlü işlem yapabilirsiniz.
Silme, güncelleme, ekleme gibi. Son kısımda ise CURSOR kapatılıyor. Bu işlemi bizim için şart değil eğer siz kapatmazsanız oracle bu işlemi gerçekleştirecektir.
LOOP
FETCH
RC_CURSOR INTO TALEP_BIRIM_ID;
EXIT WHEN RC_CURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(TALEP_BIRIM_ID);
END LOOP;
CLOSE RC_CURSOR;
END;
Kodumuzun çalışan şekli.
———————————————————————————————————————————
DECLARE
RC_CURSOR SYS_REFCURSOR;
TALEP_ID NUMBER;
TALEP_BIRIM_ID NUMBER;
BEGIN
TALEP_ID:=52;
OPEN RC_CURSOR FOR
SELECT NTALEP_BIRIM_ID FROM ITS_HRK_TALEP_BIRIM WHERE NTALEP_ID = TALEP_ID ;
LOOP
FETCH
RC_CURSOR INTO TALEP_BIRIM_ID;
EXIT WHEN RC_CURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(TALEP_BIRIM_ID);
END LOOP;
CLOSE RC_CURSOR;
END;
———————————————————————————————————————————
Bu tablolar sizde olmadığı için CURSOR ‘ı DUAL dan select yaparak doldurabilirsiniz.
Son olarak RC_CURSOR ifadesinde kullanabileceğiniz diğer parametreler
cursor%ROWCOUNT – int – CURSOR içerisindeki kayıt sayısı
cursor%ROWTYPE – CURSOR içerisindeki alanların tipi
cursor%FOUND – bool – TRUE CUROSR içerisinden veri dönerse
cursor%ISOPEN – bool – TRUE CURSOR açıksa