Makale Özeti

İmleçler, SELECT sorguları sonucunda oluşan sonuç kümeleri içinde gezeek tek tek kayıtlara erişebilmemizi ve bu kayıtlar üzerinde işlem yapmamızı sağlayan nesnelerdir. İmleçler bize çok esnek programcılık yapma olanağı sağlamaktadır...

Makale

MSSQL SUNUCUSUNDA İMLEÇLER(CURSORS) - Giriş


İMLEÇ (CURSOR) NEDİR?

Transact SQL'de, SELECT sorguları bizlere sonuç kümeleri, yani tablolar geriye döndürürler. Bu çoğunlukla bizim işimizi görecek niteliktedir. Ancak kimi zaman elde ettiğimiz sonuç kümesi içinden bazı satırları alarak işlem yapmak mecburiyetinde kalabiliriz.

Örneğin şu senaryoyu düşünelim:

Düzgün (alfabetik veya sayısal) bir şekilde sıralanmamış  bir tablomuz olduğunu varsayalım.Bu tablonun 17.satırındaki bir bilgiye ihtiyacımız olduğunda bu bilgiyi nasıl çekebiliriz?

SELECT sorguları, bizlere belirlenen mantıksal kriterlere göre bilgiyi daraltma şansı verirler. Ancak bu daraltma işlemi sonucunda oluşan sonuç kümeleri, sorgu için bir bütün(birim) teşkil eder ve bu şekilde değerlendirilir. Bize; oluşan sonuç kümelerinde gezintiler yapma ve sonuç kümesindeki her bir satıra ayrı ayrı erişebilme olanağını,  imleç (cursor) denilen nesneler verir.

İmleçleri kullanmanın iki yöntemi bulunmaktadır:

  • Transact - SQL

  • Veritabanı bağlantı arayüzleri (ADO, OLE DB, ODBC, DB-Library)

Bu iki yöntemden herhangi birini tercih ederek imleçleri kullanmak olanaklıyken, bu yöntemlerin birlikte kullanımına izin verilmemektedir. (Makalede, T-SQL imleçleri temel alınmıştır.)

İmleçlerin en önemli özelliklerinden biri de; (farklı türlere destek vererek) veri ekleme, güncelleme ve silme işlemlerine sınırlar ve farklı anlayışlar getirmesidir. Bu konu ve imleç türleri, imleçlerle ilgili bir sonraki makalemde işlenecektir.

İmleçler, bize çok esnek programcılık olanağı sunmaktadır. Ancak bu olanağı sağlarken çok yüksek boyutlarda sistem kaynağını tüketmekte ve özellikle tempdb veritabanını yoğun olarak kullanmaktadır. Bu nedenle imleçler, yalnızca gerekli durumlarda kullanılmalıdır. 

İMLEÇLERİN KULLANIMI

İmleçlerin yaşam süreci, aşağıdaki aşamalardan oluşmaktadır.

  • Bir sonuç kümesine dayanarak (ve tabii ki türünü de düşünerek) imleci oluşturmak

  • Oluşturulan imleci açarak, imlecin temelinde bulunan T-SQL sorgusunun canlanmasını sağlamak

  • Açılan imleci kullanarak kayıtlar arasında dolaşmak

  • Açılan imleci kullanarak belirli kayıtlarda düzenleme (güncelleme ve silme) işlemleri gerçeklemek

  • İmleci kapatmak

  • İmleci yok ederek, kullandığı kaynakları geri vermek

İmleç tanımlaması yapmak için gereken Transact SQL kodu aşağıdaki şekildedir.

        DECLARE CalisanImleci CURSOR FOR
        SELECT
FirstName, LastName FROM Employees

Burada imleç bir değişken gibi tanımlanmakta ve imlecin temel aldığı T-SQL sorgusu FOR sözcüğünden sonra verilmektedir.

Oluşturulan imleci kullanabilmek için, imleci açma gerekmektedir. Bunun için OPEN sözcüğü kullanılmaktadır.

        OPEN CalisanImleci

İmleç açıldıktan sonra, imleçteki kayıtlar arasındaki gezinmek için FETCH sözcüğünü kullanırız.

        FETCH NEXT FROM CalisanImleci  

Bu komut ile CalisanImleci adlı imleçte bir sonraki kayıda geçiş yapılır. Ayrıca kayıtlar arasında dolaşmak için FETCH komutunun farklı şekilleri kullanılabilir.

  • FETCH PRIOR : İmlecin bir önceki kayda geçiş yapmasını sağlar.
  • FETCH FIRST : İmlecin ilk kayda geçiş yapmasını sağlar.
  • FETCH LAST  : İmlecin son kayda geçiş yapmasını sağlar.
  • FETCH ABSOLUTE n : İmlecin belirtilen sıradaki kayda geçiş yapmasını sağlar.
  • FETCH RELATIVE n  : İmlecin bulunan kayıttan belirtilen sıra ötesindeki kayda geçiş yapmasını sağlar.

( Not : Farklı imleç türlerinde, FETCH komutlarının farklı şekillerinin tümüne destek verilmeyebilmektedir. Bu konu ve imleç türleri, imleçlerle ilgili bir sonraki makalemde işlenecektir. )

FETCH komutlarıyla, kayıt kümesi üzerinde gezinti yaparken, her bir kaydın içindeki değerler, sütun sıralamasına uygun olarak değişkenlere aktarılabilmektedir.

        DECLARE @ad VARCHAR(20), @soyad VARCHAR(20)
        FETCH NEXT FROM Calisanİmleçi INTO @ad, @soyad
        PRINT @ad
        PRINT @soyad

         

FETCH komutları ile kayıt kümesi üzerinde gezinti yapılırken, gezintinin durumu ve gezinti sırasında uğranılan kayıtların durumları hakındaki bilgi @@FETCH_STATUS denilen global değişkenden öğrenilebilir. Bu değişken genellikle, kayıt kümesi üzerinde döngü kurularak tam bir gezinti yapmak için kullanılır.

@@FETCH_STATUS'un alabildiği değerler ve bu değerlerin gezinti işlemi için anlamları aşağıdaki şekildedir.

0 FETCH komutu başarılı bir şekilde diğer bir kayda geçiş yapabilmiştir.
-1 FETCH komutu, diğer bir kayda geçiş yapamamıştır.(Kayıt kümesi başı veya sonu olması olasıdır.)
-2 FETCH komutu kaybolmuş bir kayda geçiş yapmıştır.

* Bu konu ve imleç türleri, imleçlerle ilgili bir sonraki makalemde işlenecektir. 

Açılan imleci kapatmak için CLOSE komutu kullanılmaktadır. İmleç kapatıldıktan sonra tekrar açıldığında, imleç kayıt kümesinin başına konuşlanır.

        CLOSE CalisanImleci

Oluşturulan imleçle işlerimiz bittiğinde imleç DEALLOCATE komutu çağırılarak yok edilir. Bu komutla imlecin kullandığı bellek alanları ve sistem kaynakları geri verilir, tempdb veritabanı üzerinde kullandığı geçici tablolar yok edilir. Yok edilen imleç yeniden kullanılmak istendiğinde DECLARE komutu ile yeniden oluşturulmalıdır.

        DEALLOCATE CalisanImleci

 

ÖRNEK SENARYO ve UYGULAMA

Hazırladığımız TEST veritabanı üzerinde oluşturduğumuz DENEME tablosuna bir uygulama aracılığıyla veri girişi yapılmıştır. Ancak daha sonra yapılan sınamalar sonucunda; girilen kayıtlardan tek sayı seferincilerinde girilenlerinde, uygulamanın hatası nedeniyle, MALIYET alanlarının %20 fazla işlendiği anlaşılmıştır. Bu durumu düzeltebilecek bir T-SQL sorgusunun yazılması gerekmektedir.

Not : Belirtilen veritabanı ve tablonun şema kodlarını ve bir miktar hatalı veri girişini temsil eden INSERT sorgularını içeren SQL dökümanı, makalenin Download bölümünden indirilebilir.

   Hatalı veriler

İşte imleçler sahnede. Kayıtların içinde gezinerek tek sırada bulunanlar alınarak güncelleme yapılacaktır.

 

  Düzeltilmiş veriler

DYNAMIC ifadesi, güncellenebilir bir imleç için kullanılmıştır. Bu konu ve imleç türleri, imleçlerle ilgili bir sonraki makalemde işlenecektir.

CURRENT OF ifadesi, imlecin bulunduğu satırı işaret etmek için kullanılır. Özellikle veri güncelleme ve kayıt silme işlemlerinde kullanışlıdır.

Not : Hata düzeltme kodu makalenin Download bölümünden indirilebilir.

 

SONUÇ

İmleçler, SELECT sorguları sonucunda oluşan sonuç kümeleri içinde gezeek tek tek kayıtlara erişebilmemizi ve bu kayıtlar üzerinde işlem yapmamızı sağlayan nesnelerdir. İmleçler bize çok esnek programcılık yapma olanağı sağlamaktadır. Ancak imleçlerin kullanım maliyetleri çok fazla olduğundan, imleçler yalnızca gerekli olduğunda kullanılmalıdır.

 

Anıl YÜGEN
anil.yugen@bilgeadam.com

Kaynak : MSSQL Books Online, Cursors

Örnekler