Makale Özeti

Daha önce T-SQL konulu farklı yazılarda cursor(imleç) lerden bahsetmiştik. Bu yazımızda ise biraz daha konunun detayına inmek istiyorum.

Makale

Daha önce T-SQL konulu farklı yazılarda cursor(imleç) lerden bahsetmiştik. Bu yazımızda ise biraz daha konunun detayına inmek istiyorum.

Şimdiye kadar hep klasik select ifadeleri ile bize döndürülen sonuç kümeleri ile çalışmak durumunda kalmıştık. Bu sonuç kümeleri birer tablo mantığındaydı. Her ne kadar SQL ifadeleri sayesinde sonuç kümesinin çapını daraltmayı başarabilsekde bu yine de bizim istediğimiz manada tek bir kayda ulaşmayı olanaklı hale getirmeyebilirdi.

Düşününkü elinizde bir tablo var ve siz bu tablonun belli bir satırındaki tek bir veriye ihtiyaç duyuyorsunuz. Veya bir diğer olasılık şudur ki select ifadeleri yardımıyla elde ettiğiniz bir sonuç kümesini referans alarak bu sonuç kümesi içindeki her bir veriyi sırayla kullanmak suretiyle başka SQL sorguları çalıştırmak istiyorsunuz. Bu durumda klasik anlamda SQL bileşenleri işinizde size yardımcı olamayacaktır.

İşte tam burada devreye giriyor imleç(cursor) yapısı.

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




Evren AYAN
Microsoft MVP
http://www.evrenayan.net