İçindekilerGirişİndex
YukarıİlkÖnceki YokSonrakiSon
Geriİleri
Yazdır
Cemil Sezer
jemilsezer@yahoo.com

SQL SERVER’ DA CURSOR KULLANIMI

SQL (Structured Query Language) ilişkisel veritabanı yönetiminde kullanılan veri tanımlama, işaretleme ve kontrol dilidir. SQL’in her ne kadar belirlenmiş bir standardı olsa da (SQL-92) ticari yazılımlar bu standarda ek özellikler ve işlevler eklemiştir. T-SQL (Transact SQL) MS SQL SERVER’ın kullandığı SQL dilidir.

Cursor’lar bir veri grubu (tablo) üzerinde satır satır işlem yapabilmeyi sağlar ve birçok veritabanı sistemi tarafından da desteklenir. Cursor tanımlanması ve kullanımına bir göz atalım.

Örnek tablolarımız şu şekilde olsun:

PERSONEL
ID	ADI		SOYADI		YASI	
1	YENER	ÜNAL			25
2	ALİ		FİDAN			30
3	ÖMER 	TANAÇAN		28

AILE_BILGILER
ID	ADI		SOYADI	YAKINLIK_ID		YAKIN_ID
1	METİN	ÜNAL		1			1
2	LEYLA	ÜNAL		2			1
3	TUNÇ 	FİDAN		3			2
4	DERYA	FİDAN		2			2
5	AHMET	FİDAN		1			2
6 	DERYA	TANAÇAN	1			3


YAKINLIK_DERECELERI
ID	ACIKLAMA
1	BABA
2  	ANNE
3  	KARDES

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.

İçindekilerGirişİndex
YukarıİlkÖnceki YokSonrakiSon
Geriİleri
Yazdır