İmleç nedir?
SQL küme (set) tabanlı çalışır: bir UPDATE binlerce satırı tek seferde değiştirir. Bazen ise satırları tek tek dolaşmak gerekir: her müşteri için bir prosedür çağırmak, her veritabanının yedeğini almak gibi. Bunun için imleç (cursor) kullanılır.
İmlecin yaşam döngüsü
DECLARE ad CURSOR FOR SELECT ...: tanımlaOPEN ad: sorguyu çalıştırFETCH NEXT FROM ad INTO @degiskenler: bir satır okuWHILE @@FETCH_STATUS = 0: satır geldikçe döngüCLOSE adveDEALLOCATE ad: kapat ve serbest bırak
DECLARE @ad NVARCHAR(50), @maas INT;
DECLARE maas_cur CURSOR LOCAL FAST_FORWARD FOR
SELECT first_name, salary
FROM employees
WHERE dept_id = 3
ORDER BY salary DESC;
OPEN maas_cur;
FETCH NEXT FROM maas_cur INTO @ad, @maas;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @ad + N': ' + CAST(@maas AS NVARCHAR(20)) + N' TL';
FETCH NEXT FROM maas_cur INTO @ad, @maas;
END;
CLOSE maas_cur;
DEALLOCATE maas_cur;
@@FETCH_STATUS | Anlamı |
|---|---|
| 0 | Satır başarıyla okundu |
| −1 | Okunacak satır kalmadı (veya okuma başarısız) |
| −2 | Okunacak satır artık yok (silinmiş) |
Seçenekler
LOCAL: İmleç yalnızca bu batch/prosedürde görünür. Her zaman yazılması önerilir.FAST_FORWARD: Salt okunur, yalnızca ileri giden en hızlı imleç.SCROLL/STATIC:FETCH PRIOR,FIRST,LAST,ABSOLUTE nile geri ve ileri gidilebilir.
Ne zaman kullanmamalı?
İmleçler küme tabanlı sorgulardan genellikle yüzlerce kat yavaştır: her FETCH ayrı bir işlemdir ve kilitler daha uzun tutulur. Hesaplama veya güncelleme yapıyorsan önce tek bir UPDATE, INSERT ... SELECT veya pencere fonksiyonuyla yazmayı dene.
-- İmleçle (yavaş): her ürünü tek tek güncellemek -- DECLARE c CURSOR FOR SELECT product_id FROM products WHERE category = 'Kitap' -- ... UPDATE products SET price = price * 1.1 WHERE product_id = @id ... -- Küme tabanlı (hızlı): tek ifade UPDATE products SET price = ROUND(price * 1.1, 2) WHERE category = N'Kitap'; SELECT name, price FROM products WHERE category = N'Kitap';
İmlecin meşru kullanımlarıHer satır için saklı yordam çağırmak, yönetim betikleri (her veritabanı / her tablo için bakım), satır satır e-posta gönderimi gibi dış işlemler ve sırayla birbirine bağımlı hesaplar.