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;

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…
teşekkürler hocam:)