Salı , 5 Ağustos 2014
Son Haberler
Anasayfa / MAKALELER / Veri Tabanı / SYS_REFCURSOR un içeriğine Erişmek

SYS_REFCURSOR un içeriğine Erişmek

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

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 *

*


Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>