Change Font Size

Change Screens

Change Profile

Change Layouts

Change Direction

Change Menu Styles

Cpanel
Perşembe, 16 Aralık 2010 13:06

SYS_REFCURSOR İçeriğine Erişmek

Yazan&Gönderen  Osman DUMAN
Bu Öğeyi Derecelendir
(0 Oylar)

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 
resim1


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.


resim21

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
 

Osman DUMAN

Osman DUMAN

Sakarya Üniversitesi Bilgisayar Mühendisliği Bölümünden mezun ve bir kamu kurumunda Asp.NET ve Oracle kullanarak web tabanlı yazılım geliştirmektedir. Kullandığı teknolojiler Asp.NET, Oracle, PL_SQL, HTML, CSS, C#.Ulaşabileceğiniz adresler [email protected], [email protected], http://twitter.com/osmndmn, http://www.facebook.com/duman.osman

E-posta: Bu e-Posta adresi istek dışı postalardan korunmaktadır, görüntülüyebilmek için JavaScript etkinleştirilmelidir

Yorum yaz

Make sure you enter the (*) required information where indicated.
Basic HTML code is allowed.

You are here Kategoriler ORACLE SYS_REFCURSOR İçeriğine Erişmek