SQL SERVER’ DA CURSOR KULLANIMI

Cursor’lar bir veri grubu (tablo) üzerinde satır satır işlem yapabilmeyi sağlar.

Cursor’dan önce cursor’dan dönecek değerleri tutacak değişkenleri tanımlayalım:

DECLARE @VAR_ID INT
DECLARE @VAR_ADI VARCHAR(50)

DECLARE CRS_PERSONEL CURSOR FOR
SELECT ID,ADI FROM PERSONEL ORDER BY YASI

PERSONEL tablosundaki verilerin ID ve AD alanlarını alacak cursor’ı tanımladık. Ancak bir cursor’ın belirttiğimiz değerleri yüklemesi için onu açmamız gerekir:

DECLARE @VAR_ID INT
DECLARE @VAR_ADI VARCHAR(50)

DECLARE CRS_PERSONEL CURSOR FOR
SELECT ID,ADI FROM PERSONEL ORDER BY YASI

OPEN CRS_PERSONEL

Artık cursor’ımız satırlar üzerinde dolaşmak için hazır. Ancak cursor’ımız şu anda hiçbir satırın üzerinde değil.

DECLARE @VAR_ID INT
DECLARE @VAR_ADI VARCHAR(50)

DECLARE CRS_PERSONEL CURSOR FOR
SELECT ID,ADI FROM PERSONEL ORDER BY YASI

OPEN CRS_PERSONEL

FETCH NEXT FROM CRS_PERSONEL INTO @ID,@ADI

Artık cursor’ımız verilerimizin ilk sırasında. @ID ve @ADI değişkenlerimiz artık set edildi. Benzer şekilde FETCH FIRST komutu ile ilk satıra dönüp FETCH LAST komutu ile de son satıra gidebiliriz. SQL SERVER en son işletilen FETCH komutunun durumunu @@FETCH_STATUS degişkeninde tutar. FETCH komutu başarılı ise 0, başarısız ise -1, FETCH edilen satır bulanmıyorsa da -2 döner.

DECLARE @VAR_ID INT
DECLARE @VAR_ADI VARCHAR(50)

DECLARE CRS_PERSONEL CURSOR FOR
SELECT ID,ADI FROM PERSONEL ORDER BY YASI

OPEN CRS_PERSONEL

FETCH NEXT FROM CRS_PERSONEL INTO @ID,@ADI

WHILE @@FETCH_STATUS =0
	BEGIN
		SELECT A.ADI, B.ACIKLAMA FROM AILE_BILGILER A
INNER JOIN YAKINLIK_DERECELERI B ON B.ID = A.YAKINLIK_ID 
WHERE A.YAKIN_ID = @ID


		FETCH NEXT FROM CRS_PERSONEL INTO @ID,@ADI
 
	END

Böylece satır satır tüm PERSONEL tablosu verilerini dolaşarak ID ve ADI kolonlarını istediğimiz şekilde kullanabiliriz.

Bir cursor’ın işi bittikten sonra onu CLOSE komutu ile kapatırız.

DECLARE @VAR_ID INT
DECLARE @VAR_ADI VARCHAR(50)

DECLARE CRS_PERSONEL CURSOR FOR
SELECT ID,ADI FROM PERSONEL ORDER BY YASI

OPEN CRS_PERSONEL

FETCH NEXT FROM CRS_PERSONEL INTO @ID,@ADI

WHILE @@FETCH_STATUS =0
	BEGIN
		SELECT A.ADI, B.ACIKLAMA FROM AILE_BILGILER A
INNER JOIN YAKINLIK_DERECELERI B ON B.ID = A.YAKINLIK_ID 
WHERE A.YAKIN_ID = @ID


		FETCH NEXT FROM CRS_PERSONEL INTO @ID,@ADI
 
	END

CLOSE CRS_PERSONEL

DEALLOCATE CRS_PERSONEL

CLOSE komutu ile cursor’ı kapattığımızda tuttuğu satır temizlense de halen sistem kaynağı kullanmaktadır. Bu kaynakları da DEALLOCATE komutu ile serbest bırakırız.

Deyim Açıklama
DECLARE CURSOR Cursor yapısını oluturur ve kullanımı için bellekte yer açar
OPEN Declare edilmiş cursor u kullanıma açar
FETCH Cursorun oluşturduğu resultset te navigasyon (ileri-geri) hareket sağlar
CLOSE Cursor kapatılır
DEALLOCATE Cursor sistemden silinir ve kullanılan bellek açığa kavuşur

Cursor kullanımı esnasında output verebilen birçok fonksiyon kullanılır. Örnek vermek gerekirse en çok kullanılanlar arasında :

@@Fetch_Status = Açık bağlantı ve cursor yapısı içinde bulunulan pozisyonun son kayıta göre konumunu belirtir. Bunu bir For döngüsüne benzetmek mümkündür. Örneğin WHILE (@@FETCH_STATUS = 0) deyimiyle son kayıtta olmamız durumundan bahsedilmektedir.

@@Cursor_Rows = Mevcut bağlantı içinde son açılan cursor un resultsetinde yer alan kayıt sayısını verir.

Cursor_Status = Bir Stored Procedure çalıştırdığınızda size output değeri vermek için bir cursor hazırlar. Bu tag sayesinde hazırlanan cursor un durumu hakkında bilgi alınabilir.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s