Microsoft Word’de yazı yazarken karşımıza çıkan imleç ile T-SQL de kullanacağımız imleçler aynı görevi yapmaktadır. Veritabanı sistemlerinde imleç hangi satırdaysa oradaki veriler üzerinde işlem yapılmasını sağlar. İmleçler sunucuyu aşırı yavaşlattıkları için imleçlerin kıllanımı önerilmemektedir. İmleçler bir veri tipi olarak tanımlanmış ve SELECT ifadesi ile birlikte kullanılırlar. SELECT ifadesindne dönen her sütun içinn değişken tanımlaması yapılmalıdır.
1 2 3 4 5 |
DECLARE IMLEC_ISMI CURSOR [FORWARD_ONLY |SCROLL] [STATIC | KEYSET | DYNAMIC | FAST_FORWARD] [RADONLY |SCROLL_LOCKS | OPTIMISTIC] FOR SELECT_SORGUSU |
İmleç oluşturmak için kullanım şekli yukarıda ki gibidir.
BAKIYE bilgisi 5000’den az olan BAKIYE lerin fiyatını %30, 5000’den fazla olanların değerini %20 arttıran sql sorgusunu yazalım. Eğer biz bu sorguyu UPDATE tek başına kullanarak ayrı ayrı yazsaydık ne olurdu? %30 artan bir update sonucunda 2 kaydın 5000 üzerine çıktığını düşünelim. İkinci update’de 5000 üzerinde ki kayıtlar %20 artacağı için 2 kayıt tekrar miktarı artacaktı. Bunun önüne geçmek için imleçleri kullanacağız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
SELECT * FROM HESAPLAR DECLARE @HESAP_ID INT --HESAP_ID adında değişken tanımla DECLARE @BAKIYE MONEY --BAKIYE adında değişken tnaımla DECLARE BAKIYE_IMLEC CURSOR --BAKIYE_IMLEC adında CURSOR tipinde imleç tanımla FOR SELECT * FROM HESAPLAR --FOR ifadesi sabit SELECT ifadesi kodumuza göre değişebilir OPEN BAKIYE_IMLEC --İmleç ile gezinmek için OPEN sonra imleç adı yazılır FETCH NEXT FROM BAKIYE_IMLEC INTO @HESAP_ID, @BAKIYE --FETCH NEXT FROM INTO: İmlecin bulunduğu satırı okur ve değerleri değişkene atar. sonraki satıra geçer WHILE @@FETCH_STATUS=0 --okuma işilemi başarılı olduğu sürece FETCH_STATUS=0 değeri olacak ve WHILE döngüsü çalışacaktır BEGIN IF @BAKIYE<5000 --BAKIYE değişkenine atnana değer 5000den az ise UPDATE HESAPLAR SET BAKIYE=BAKIYE*1.30 --%30 BAKIYE bilgisini arttır WHERE CURRENT OF BAKIYE_IMLEC --o an bulunulan satır değişiklikten etkile ELSE --değil ise UPDATE HESAPLAR SET BAKIYE=BAKIYE*1.20 --%20 BAKIYE bilgisini arttır WHERE CURRENT OF BAKIYE_IMLEC --o an bulunulan satır değişiklikten etkile FETCH NEXT FROM BAKIYE_IMLEC INTO @HESAP_ID, @BAKIYE --FETCH NEXT FROM INTO: İmlecin bulunduğu satırı okur ve değerleri değişkene atar. sonraki satıra geçer END CLOSE BAKIYE_IMLEC --imleç ile gezinmeyi kapat DEALLOCATE BAKIYE_IMLEC --imleci hafızadan sil SELECT * FROM HESAPLAR |
Yukarıda ki CURSOR işleminde tabloda ki kayıtlar satır satır değerlendirilmekte ve şarta göre bulunulan satırlarda değişiklik yapılmaktadır. Aşağıda iki farklı select işlemi ile gerçekleşen değişiklikler ekrana yansımaktadır.