Ana içeriğe geç
Kesit SQL
İleri · T-SQL (SQL Server)

İmleçler (CURSOR): satır satır işlem

DECLARE CURSOR, FETCH, @@FETCH_STATUS ve neden küme tabanlı düşünmek gerekir.

Uygulamada aç, 5 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

İ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ü

  1. DECLARE ad CURSOR FOR SELECT ...: tanımla
  2. OPEN ad: sorguyu çalıştır
  3. FETCH NEXT FROM ad INTO @degiskenler: bir satır oku
  4. WHILE @@FETCH_STATUS = 0: satır geldikçe döngü
  5. CLOSE ad ve DEALLOCATE 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_STATUSAnlamı
0Satır başarıyla okundu
−1Okunacak satır kalmadı (veya okuma başarısız)
−2Okunacak satır artık yok (silinmiş)

Seçenekler

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.
Alıştırmalara geç (5)