Forum

cursor kullanımı
 
Bildirimler
Hepsini Temizle

cursor kullanımı

4 Yazılar
2 Üyeler
0 Reactions
3,995 Görüntüleme
(@canserce)
Gönderiler: 67
Estimable Member
Konu başlatıcı
 

merhabalar ben sql serverda cursor kullanımıyla ilgile ayrıntılı bilgi bulabileceğim döküman yada örnek cursorlar arıyorum yapmak istediğim cursor biraz karışık birşey bu konuda yardımcı olabilirmisiniz

 
Gönderildi : 22/08/2008 12:54

(@ErtanKURUN)
Gönderiler: 686
Honorable Member
 

Merhaba;


Örnek üzerinde incelenmiş yardımcı olur umarım



İmleçler ile ilgili bilmemiz gerekneler;
- İmleçleri iki türde tanımlayabilirsiniz
   - T-SQL
   - ADO, OLE DB, ODBC
- İmleçler ciddi manada sistem kaynağı kullanır bu nedenle sadece gerekli durumlarda kullanılmalıdır. Kullanım işlevi son bulduktan hemen sonra imleç yok edilmeli ve sistem kaynakları serbest bırakılmalıdır.

Klasik manada bir imleç tanımlayabilmek için gerekli syntax yapısı;

Declare <imlec_adi> cursor for
<select ifadesi>


şeklindedir. Daha önceki yazılarımızdan da hatırlayacağınız üzere imleç tanımlaması klasik değişken tanımlamasına benzemektedir. "Declare" ifadesi ile tanımlama gerçekleştirilmekte, "cursor for" ifadesi ile de bu ifade sonrasında çalışacak olan select ifadesi için bir imleç tanımladığınızı belirtmektesiniz.

Bir imleçin aktif hale gelebilmesi için önce çalıştırmanız gerekir;


Open <imlec_adi>

İmleç açıldıktan sonra kullanılabilir haldedir. İmleç yaratmaktaki amacımız kayıtlar arasında gezmekti. Peki bunu nasıl sağlayacağız. Bunun için "Fetch" ifadesini kullanacağız.

Fetch Next -- İmlecin bir sonraki kayda gitmesini sağlar
Fetch Prior -- İmlecin bir önceki kayda gitmesini sağlar
Fetch First -- İmlecin ilk kayda gitmesini sağlar
Fetch Last -- İmlecin son kayda gitmesini sağlar
Fetch Absolute x -- İmlecin x ile belirtilen kayda gitmesini sağlar

Fetch Next From <imlec_adi> şeklinde kullanılır. Bu yapıdaki kullanım imleç için referans aldığınız select ifadesinde bir sonraki kaydı kullanmaya devam edebilirsiniz anlamını taşıyacaktır.


Şimdi biraz örnek yapalım bu konuda;

Örnek : Örneğimizde iki tablomuz olacak. Birinci tablomuz olan "TBL_MARKA", "MarkaKodu" ve "MarkaAdi" isimlerinde iki alan içerecek. Diğer tablomuz olan TBL_MUSTERI'de ise müşterinin isim, email ve otomobil marka ID'lerini tutacağız. Örnek konumuz ise şu. Önce araç marka bilgilerini alacak daha sonra elde ettiğimiz her bir araç markasına göre müşteri tablomuzdaki ilgili kayıtları getireceğiz.

  


-- SQL2005DB isimli veritabanını kullanacağımızı belirtiyoruz
use SQL2005DB

-- "MarkaKodu" isimli bir değişken tanımlıyoruz. Bu değişkeni ilerleyen satırlarda Cursor'u kontrol etmek için kullanacağız.
Declare @MarkaKodu int

-- "IMLECIM" isimli bir cursor tanımlıyoruz. "Cursor For" diyerek bu imleci hemen ardından gelen select satırı için tanımladığımızı belirtiyoruz.
Declare IMLECIM Cursor For
Select MarkaKodu from TBL_MARKA

-- Tanımladığımız imlecin modunu "open" a getiriyoruz. Yani imleci kullanıma açıyoruz.
Open IMLECIM

-- İmlecin ilk kaydına ulaşıyoruz.
Fetch Next From IMLECIM INTO @MarkaKodu

-- İmleç kayıt setinin sonuna gelene kadar çalışacak bir döngü kuruyoruz
While @@Fetch_Status = 0
BEGIN
-- Döngü içinde çalışmasını istediğimiz ve imlecin o anki değeri üzerinden çalışacak olan kod bloğu bu "begin...end" yapısı içinde yer alacak. -- Biz burada ekrana MUSTERI tablosundaki kayıtların gelmesini istiyoruz. Ancak bu işlemi yaparken imlecin o anki değerini koşul olarak
-- koyuyoruz.

    Select * from TBL_MUSTERI where Otomobil = @MarkaKodu
        -- İmlecin o anki değeri ile işimiz bittiğinde imlecin bir sonraki kayda ilerlemesini sağlıyoruz
    Fetch Next From IMLECIM INTO @MarkaKodu
END

-- "Open" metoduyla kullanıma açtığımız imleci kapatıyoruz
Close IMLECIM
-- İmleci tamamen yok ediyoruz.
DeAllocate IMLECIM


Yaptığımız işi özetleyecek olursak;

TBL_MARKA'dan "MarkaKodu" alanlarını aldık ve imlecimizi bu kayıt seti üzerinde çalışacak halde yarattık. Sonrasında bir döngü ile imleçin kayıtlar içersinde sırayla gezinmesini ve bu gezinti sırasında TBL_MUSTERI'deki ilgili kayıtları ekrana getirmesini sağladık.



Alıntıdır

 
Gönderildi : 22/08/2008 14:21

(@canserce)
Gönderiler: 67
Estimable Member
Konu başlatıcı
 

ilginize çok teşekkürler şimdi üzerinden öyle bir baktım vaktim yok ama akşam  baya üstüne düşücem saolun

 
Gönderildi : 22/08/2008 17:22

(@ErtanKURUN)
Gönderiler: 686
Honorable Member
 

Rica ederim kolay gelsin

 
Gönderildi : 22/08/2008 20:28

Paylaş: