SQL Server’da Cursor (İmleç), bir sorgu sonucunda dönen veri kümesini (result set) satır satır işlemenize olanak tanıyan bir veritabanı nesnesidir.
Normalde SQL, küme tabanlı (setbased) çalışır; yani bir UPDATE veya SELECT yazdığınızda tüm satırlar aynı anda işleme alınır. Cursor ise satır tabanlı (rowbased) bir yaklaşım sunar. Yazılım dillerindeki foreach veya while döngülerine benzer.
Bir Cursor yapısı standart olarak 5 aşamadan oluşur:
- DECLARE: Cursor tanımlanır ve hangi SELECT sorgusunu kullanacağı belirlenir.
- OPEN: Cursor açılır ve sorgu çalıştırılarak sonuçlar belleğe alınır.
- FETCH NEXT: İlk satır (ve döngü içinde sıradaki satırlar) okunur ve değişkenlere atanır.
- CLOSE: İşlem bittiğinde Cursor kapatılır (bellek boşaltılır).
- DEALLOCATE: Cursor tanımı tamamen silinir.
Diyelim ki bir müşteri tablonuz var ve her müşteriye özel bir işlem (örneğin mail gönderme simülasyonu veya karmaşık bir hesaplama) yapmanız gerekiyor:
--Değişkenleri ve Cursor'ı Tanımla
DECLARE @MusteriAd NVARCHAR(50);
DECLARE @MusteriSoayd NVARCHAR(50);
DECLARE MusteriCursor CURSOR FOR
SELECT Adi,SoyAdi FROM [dbo].[Personeller];
--Cursor'ı Aç
OPEN MusteriCursor;
--İlk Satırı Oku
FETCH NEXT FROM MusteriCursor INTO @MusteriAd,@MusteriSoayd;
-- Döngü Başlat
--(@@FETCH_STATUS = 0 olduğu sürece satır vardır
WHILE @@FETCH_STATUS = 0
BEGIN
-- Burada her satır için yapılacak işlem yer alır
PRINT 'İşlem yapılan müşteri: ' + @MusteriAd+ ' - '+@MusteriSoayd;
-- Bir sonraki satıra geç
FETCH NEXT FROM MusteriCursor INTO @MusteriAd,@MusteriSoayd;
END
--Cursor'ı Kapat
CLOSE MusteriCursor;
--Hafızadan Temizle
DEALLOCATE MusteriCursor;

Avantajlar ve Dezavantajlar
| Performans | Kötüdür. SQL Server küme tabanlı işlemler için optimize edilmiştir. Cursor kullanımı genellikle çok daha yavaştır. |
| Bellek Kullanımı | Satır satır ilerlediği için büyük veri setlerinde sunucu kaynaklarını tüketebilir. |
| Gereklilik | Eğer yapacağınız işlem standart bir UPDATE, INSERT veya JOIN ile yapılamıyorsa (örneğin her satır için ayrı bir Stored Procedure çağırmak gerekiyorsa) kullanılmalıdır. |
Cursor, SQL dünyasında “son çare” olarak görülür. Eğer işinizi UPDATE Table SET Kolon = Değer gibi bir küme işlemiyle halledebiliyorsanız, performansı korumak adına her zaman onu tercih etmelisiniz. Hangi senaryo için cursor kullanmayı düşünüyordunuz? Belki daha hızlı bir “setbased” alternatif geliştirebiliriz.
Başka makalede görüşmek dileğiyle..
“Gurura kapılarak insanlara burun kıvırma, ortalıkta çalım satarak yürüme; unutma ki Allah gurura kapılıp kendini beğenen hiç kimseyi sevmez.” Lokman-18
