C# dilinin syntax’ından (özellikle visual studio’nun da yardımları ile) sonra T-SQL çoğumuz için kabus gibi gelebilir. Ancak zamanla bu ön yargının kırıldığını söyleyebilirim. Nitekim benim için böyle oldu . Bugün SQL’de çok da fazla sevilmeyen cursor konusunu inceleyeceğiz. Çoğu programlama dilinde görmeye alıştığımız for döngüsü ile aynı işlevdedir aslında. Cursor’lar Kayıtlara satır satır erişmemize imkan sağlar. Cursor tanımlarken içerisinde döneceği bir select ifadesi yazarız ve her bir turda elde edilen değerler için bir takım işlemler yaparız.
AdventureWorks veri tabanındaki Product tablosunda bulunan ürünlerin fiyatlarını ele alalım. Fiyatı 0 ise “bedava”, 1-1000 arasında ise “ucuz”, 1000’den fazla ise “pahalı” ifadelerini ekrana yazdıralım.
DECLARE @Result TABLE --Sonuç kümesini tutacağımız bir tablo tanımladık
(
Name NVARCHAR(50),
Durum NVARCHAR(10)
)
DECLARE cr_Read CURSOR FOR
SELECT Name,ListPrice FROM Production.Product --cursor'un gezeceği sorgu. Her satır için ad ve fiyat bilgisini elde edeceğiz.
DECLARE @name NVARCHAR(50), @listprice MONEY --döngünün her satır için tuttuğu değerleri atamak için değişkenler tanımladık. Select ifadesinde elde ettiğimiz isim ve fiyat değerlerini bu değişkenlere atayacağız.
OPEN cr_Read --SqlConnection kullanırken bağlantı açmak gibi düşünülebilir. (conn.Open() gibi)
FETCH NEXT FROM cr_Read INTO @name, @listprice --Her bir satır için dönmesini sağlayan komut
--ya da " FETCH cr_Read INTO @name, @listprice " şeklinde yazılabilir.
WHILE @@FETCH_STATUS=0 --Satırdan değer gelip gelmediğini kontrol ediyoruz. 0 ise Name ve ListPrice kolonlarından değer gelmiş demektir.
BEGIN
DECLARE @durum NVARCHAR(20)
IF(@listprice=0)
BEGIN
SET @durum='Bedava'
END
ELSE IF(@listprice<1000)
BEGIN
SET @durum='Ucuz'
END
ELSE
BEGIN
SET @durum='Pahalý'
END
INSERT INTO @Result VALUES(@name,@durum)
FETCH NEXT FROM cr_Read INTO @name, @listprice --her bir satır için dönülecek sorguyu tekrar ediyoruz. Çünkü veriye erişim yapıldıktan sonra döngüye girilmektedir.
END
CLOSE cr_Read --cursor’un içerdiği sonuç kümesi boşaltılır.
DEALLOCATE cr_Read --cursor’a erişimi engeller ve belleği temizler. Bu komutu yazmassak cr_Read ismind başka bir cursor tanımlayamayız çünkü hafızada açılan yer kullanımda kalır.
SELECT * FROM @Result --sonuç kümesini görüntülüyoruz.
6 yorum:
Hocam bunu sql üzerinde yapmamız bize ne kazandırır?Misal bir datatable içerisinde column'lar tanımlayarak datayı o column'lar içerisine yerleştirsek. Daha sonra bunların içerisinde dönerek, böyle döne döne işlemimizi yapsak daha kolay olmaz mı?Yeni başladım bu işlere o yüzden yardımcı olursanız sevinirim.
Valla hocam 1 haftadır Cursor hakkında makale okuyorum Sizin açıklamanıza bayıldım.Ellerinize sağlık.SQL ile alakalı birden çok makaleyi böyle anlatımla bekliyorum iyi çalışmalar...
Teşekkür ediyorum, arşiv kısmında SQL ile alakalı diğer başlıkları inceleyebilirsiniz. Kolay gelsin...
Başarılarınızın Devamını dilerim
Başarılarınızın Devamını dilerim
Onur Hocam güzel anlatımınız için teşekkür ederim.
Yorum Gönder