MSSQL – Cursor Kullanımı

MSSQL içerisinde bir çoğumuzun bildiği üzere çok sayıda döngü bulunmamakta. Bu yüzden genellikle WHILE döngüsüne hapsolup kalabiliyoruz. Ancak kimi zaman kayıtlarda işlem yaparken birden fazla alana ihtiyaç duyabiliyor ve o alanları döngünün içerisinde kullanmak isteyebiliyoruz.

Aslını isterseniz CURSOR metodu da tam olarak burada imdadımıza yetişiyor. Kendisi WHILE döngüsü ile birlikte kullanılan bir yöntem aslında. Tek farkı da, WHILE ile tek başına rakam içerisinde dönerken CURSOR ile birlikte kullanımında bellekte o döngü sırasına birden fazla değişken barındırabiliyor ve döngü içerisinde kullanabiliyor olmanız.

CURSOR Kullanımında Dikkat Edilmesi Gerekenler

Birazdan vereceğimiz örnek kodda da olduğu gibi, döngüye girdikten ve işleminiz bittikten sonra mutlaka ama mutlaka CURSOR’ı kapatmanız, yani sonlandırmanız gerekmektedir. Aynı işlemi ikinci kez çalıştırmak istediğinizde aşağıdaki şekilde bir hata ile karşılaşırsınız.

A cursor with the name 'CRS_CURSOR' already exists.

İşte bu hata, ilgili CursorName’a ait CURSOR’ın zaten bellekte olduğunu ve çalışmakta olduğunu gösterir size. Bu işlem bellekten yok olana veya siz manuel bunu…

CLOSE CRS_CURSOR  
DEALLOCATE CRS_CURSOR 

…Kodu ile yok edene kadar bu hata kalmaya devam edecektir.

CURSOR Örnek Uygulama İle Kullanımı

Aşağıdaki alanlara ait bir tablo oluşturalım;

Burada tümüyle örnek alan adları kullanılmıştır. Sonra, *** bu ne kadar saçma bir veritabanı falan demeyin. 🙂

CURSOR kullanım örneği ile de bu veritabanını bir şarta bağlı olmadan okuyarak tüm alanları birleştirip yan yana yazacağız sadece. İşte kodumuz;

DECLARE @Id INT
DECLARE @name NVARCHAR(50)
DECLARE @surname NVARCHAR(50)
DECLARE @birthdate DATETIME
DECLARE CRS_CURSOR CURSOR FOR

SELECT * FROM Users

OPEN CRS_CURSOR  
FETCH NEXT FROM CRS_CURSOR INTO @Id, @name, @surname, @birthdate

WHILE @@FETCH_STATUS = 0  
BEGIN  
      
	  SELECT 'Kişi Bilgileri: ' + @name + ' ' + @surname + ' ' + CONVERT(NVARCHAR(50), @birthdate)

      FETCH NEXT FROM CRS_CURSOR INTO @Id, @name, @surname, @birthdate 
END 

CLOSE CRS_CURSOR  
DEALLOCATE CRS_CURSOR 

Bu işlemin sonucunda aşağıdaki şekilde bir karşılık alacaksınız;

İşte gördüğünüz gibi bu şekilde basitçe kullanımını görmüş oluyoruz.

6. Satırda, içerisinde dönmek istediğimiz sorguyu yazabiliyoruz. Eğer name alanında ER geçen kullanıcı kayıtlarının içerisinde dönmek isteseydik kodumuzun üst kısmı aşağıdaki şekilde olmalıydı.

DECLARE @Id INT
DECLARE @name NVARCHAR(50)
DECLARE @surname NVARCHAR(50)
DECLARE @birthdate DATETIME
DECLARE CRS_CURSOR CURSOR FOR

SELECT * FROM Users WHERE name LIKE '%er%'

Aşağıdaki alanda ise, tümüyle her bir kayıt içerisindeyken ne yapacağımızı belirtmiş oluyoruz.

WHILE @@FETCH_STATUS = 0  
BEGIN  
      

	  SELECT 'Kişi Bilgileri: ' + @name + ' ' + @surname + ' ' + CONVERT(NVARCHAR(50), @birthdate)


      FETCH NEXT FROM CRS_CURSOR INTO @Id, @name, @surname, @birthdate 
END 

Sorularınız olur ise lütfen yorum olarak yazın. Yanıtlamaktan keyif duyarım. Herkese iyi çalışmalar…

Share this Story

Related Posts

Kimler Neler Demiş?

avatar
  Subscribe  
Bildir

Sponsor Bağlantılar

Sponsor Bağlantılar