Yazılım Mimarileri ve Tasarım Desenleri Üzerine

MS SQL Server – Cursor Nedir? Neden ve Nasıl Kullanılır?

Merhaba,

T-SQL her ne kadar bir veri tanımlama, işaretleme ve kontrol dili olsada yapısal olarak bazen var olan konseptin dışında ihtiyaçlar doğrultusunda kullanmamız gerekebilen programlama dilidir. Çekilen verileri bütünsel ve kümesel olarak her türlü işleme tabi tutabildiğimiz T-SQL konseptinde eğer ki elde edilen veri kümesi içerisinde satır satır işlem yapmamız gereken bir durum söz konusu olursa dilin yeteneği olan while döngüsünü birşekilde kullanabiliriz lakin özellikle bu işlem için geliştirilmiş Cursorları tercih etmemiz daha doğru olacaktır. O halde gelin Cursor nedir, nasıl kullanılır? inceleyelim…

Cursor Nedir?

Cursorlar, veri kümesindeki her bir veriyi adım adım bizlere getiren ve bu şekilde satırsal bazda işlem yapmamızı sağlayan yapılardır. Çalışma şekilleri varsayılan olarak ileri doğru olsada ileri ve geri olmak üzere sırasıyla tüm satırları elde etme usulüne dayanır. İleri doğru okuma işlemi yapan Cursorlar geriye doğru okuma işlemi yapanlardan kat be kat hızlı çalışmaktadırlar.

Cursor Neden Kullanılır?

Her yapının bir kullanım nedeni olduğu gibi Cursorların kullanım nedenleride aşağıdaki durumlardır;

için kullanılır.

Cursor Kullanımı

Bir cursor tanımını örneklendirebilmek için onu belli bir senaryoda kullanarak tanıtmak en doğrusudur. Bu sebepten dolayı Northwind veritabanında bulunan “Personeller” tablosunda her bir satır için yapmış olduğumuz aşağıdaki cursor çalışma örneğini inceleyiniz.

‘SELECT * FROM Personeller’
sorgusunun çıktısı
Adı Soyadı Ünvan
Nancy Davolio Sales Representative
Gençay Fuller Vice President, Sales
Janet Leverling Sales Representative
Margaret Peacock Sales Representative
Steven Buchanan Sales Manager
Michael Suyama Sales Representative
Robert King Sales Representative
Laura Callahan Inside Sales Coordinator
Anne Dodsworth Sales Representative
DECLARE @Adi NVARCHAR(MAX), @Soyadi NVARCHAR(MAX), @Unvan NVARCHAR(MAX)
// Cursor oluşturuluyor.
DECLARE PersonelCursor CURSOR
FOR							
// Cursor'un temsil edeceği veri kümesini getirecek olan sorguyu belirtiliyoruz.
SELECT Adi, Soyadi, Unvan FROM Personeller
// Cursor açılarak kaynak tüketimi başlatılıyor.
OPEN PersonelCursor
// Sıradaki veri yakalanıyor ve hafızaya alınıyor. O anki veri 'PersonelCursor' tarafından temsil ediliyor ve kolon değerleri ilgili değişkenlere sıralı bir şekilde atanıyor.
FETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan
// İşlem başarılı ise @@FETCH_STATUS değişken değeri '0' ise işlem başarılıdır ve bir sonraki kayıt var demektir.
WHILE @@FETCH_STATUS = 0
	BEGIN
		PRINT @Adi + ' ' + @Soyadi + ' ' + @Unvan
		-- Sıradaki veriye geçilir ve tekrardan cursor üzerinden kolon değerleri ilgili değişkenlere atanır.
		FETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan
	END
// Cursor kapatılıyor.
CLOSE PersonelCursor
// Tarafımıza ayrılan hafızayı boşaltıyoruz.
DEALLOCATE PersonelCursor

Yukarıdaki çalışmayı satır satır izah edersek eğer;

Cursor’ı çalıştırdığımızda aşağıdaki sonucu almaktayız;

Cursor Kaydırma Komutları

Cursor varsayılan olarak sadece ileriye doğru hareket eden bir yönteme sahiptir. Buna FORWARD_ONLY denmektedir. Yukarıdaki örnekte her ne kadar yazmasakta esasında ilgili cursor aşağıdaki gibi FORWARD_ONLY özelliğini ifade edecek şekilde tanımlanabilir.

Ayriyetten bizler cursor’ı ileri kaydırdığımız gibi geri de kaydırabilmekte ve hatta ilk ya da son kayda direkt olarak erişebilmekteyiz. Tüm bu işlemleri aşağıdaki FETCH ile kullanacağımız yan komutlar ile gerçekleştirmekteyiz;

Yukarıdaki FECTH yan komutlarına göz atarsanız eğer hepsinin cursor tanımlamasına ek olarak SCROLL ifadesinin yazıldığına dikkatinizi çekerim. (Dikkat! SCROLL, NEXT komutu dışındakilerde zorunludur)

Diğer FECTH yan komutlarımız ise;

Cursor Türleri Nelerdir?

Cursorlar çeşitli özelliklerine göre dört farklı türe ayrılır. Şimdi gelin bu farklı cursor türlerini detaylarıyla birlikte inceleyelim.

Cursor’da Sütun Güncelleme(FOR UPDATE)

Ana tabloda cursor içerisinde kullanılan kolonlardan herhangi birinde bir güncelleme söz konusu olursa eğer bunu FOR UPDATE ile belirterek aşağıdaki gibi güncellemeyi ilgili cursor’a yansıtabilmekteyiz.

Burada sadece belirtilen sütunların güncelleneceğine dikkatinizi çekerim. Aksi taktirde belirtilmeyen kolonlar read only olacak ve herhangi bir müdahale edildiğinde hata ile karşılaşılacaktır.

DECLARE @Adi NVARCHAR(MAX), @Soyadi NVARCHAR(MAX), @Unvan NVARCHAR(MAX)
DECLARE PersonelCursor CURSOR
FOR
SELECT Adi, SoyAdi, Unvan FROM Personeller
FOR UPDATE OF Adi, Soyadi
OPEN PersonelCursor
FETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan
WHILE @@FETCH_STATUS = 0
	BEGIN
		UPDATE Personeller SET Adi = 'Hüseyin', SoyAdi = 'Kamburoğulları' WHERE CURRENT OF PersonelCursor
		PRINT @Adi + ' ' + @Soyadi + ' ' + @Unvan
		FETCH NEXT FROM PersonelCursor INTO @Adi, @Soyadi, @Unvan
	END
CLOSE PersonelCursor
DEALLOCATE PersonelCursor

Vee böylece Transact SQL’de bizlere manevra kazandıran mühim ve kritik olan Cursor yapılanmasını detaylıca incelemiş ve irdelemiş bulunmaktayız.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Exit mobile version