15 Aralık 2011 Perşembe

SQL Cursor Kullanımı

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 Smile. 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.

image

 



6 yorum:

isonka dedi ki...

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.

Sercan dedi ki...

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...

Onur Salkaya dedi ki...

Teşekkür ediyorum, arşiv kısmında SQL ile alakalı diğer başlıkları inceleyebilirsiniz. Kolay gelsin...

Onur Çetin dedi ki...

Başarılarınızın Devamını dilerim

Adsız dedi ki...


Başarılarınızın Devamını dilerim

Okan dedi ki...

Onur Hocam güzel anlatımınız için teşekkür ederim.

Yorum Gönder