CURSOR LAR

Merhaba arkadaşlar;

Bu makalemizde birçok uygulamamızda neredeyse hiç ihtiyaç duymadığımızdan dolayı bir çokları tarafından gereksizmiş gibi algılanan fakat  bazen çok zor olan şeyleri kolaylıkla çözüme kavuşturabildiğimiz Cursor leri inceleyeceğiz.

Cursor lar SQL de bir sonuç kümesindeki satırları tek tek işleyebilme yetisine sahiptirler. C# ta sık sık kullandığımız data reader classlarına benzemekle birlikte Cursor’ları SQL Scriptlerinde ve stored procedurelerde de kullanabilmekteyiz.

Peki bir Cursor nasıl tanımlarız ve ne şekilde kullanırız sırası ile bunları hep beraber inceleyelim dilerseniz.

Bir Cursor oluşturmak için deklare derek sonuç kümesini belirtiyor olmamız gerekmektedir.

DECLARE SampleCurser CURSOR FOR (select cümleciği)
Burada dikkat ederseniz DECLARE anahtar kelimesinin başına @ işaretini koymadık.

Yine işin güzel taraflarından biride Cursor tipinde değişkenler tanımlayarak bunları oluşturduğumuz Cursorlara atayabilmekteyiz.

Ayrıca stored procedure ve fonksiyon cursorlarınada referans verebilmekteyiz.

SELECT @SampleCursorVariable CURSOR
SET  @SampleCursorVariable = SampleCurser

Dilerseniz şimdi bir curser tanımlayalım…

DECLARE OrnekCurser CURSER FOR ( SELECT * FROM TabloIsmi )

Cursorümüzü oluşturduktan sonra tablomuzdan verileri okutmaya geçmeden önce elbetteki klasik olarak Cursor ümüzü açmamız gerekmekte. Bunun içinde OPEN sözcüğünü kullanıyor olacağız her zamanki gibi.

OPEN OrnekCurser

Cursor ümüz açık olduğu sürece verileri almak ve eğer iznimiz varsa verileri değiştirmek için kullanabilmekteyiz. Tabi işlemlerimiz bittikten sonra Cursor ümüzü kapatmayıda ihmal etmiyoruz. Tahmin ettiğiniz gibi CLOSE sözcüğü ile bu işlemi yapmaktayız.

CLOSE OrnekCursor

Tanımladığımız Cursor ü kapattığımız anda haliyle döndürdüğü tüm sonuçlarıda serbest bırakmış oluruz. Fakat bu tanımladığımız Cursor ü tekrar kullanamayacağımız anlamına gelmemektedir. Elbetteki dilediğimiz zaman tekrar kullanmamız üzere Cursor bekletilmektedir. Tabi burada şunu diyebilirsiniz:  “Eeee bizim tanımladığımız bu cursor ile işimiz tamamen bitti ve kullanmayacağım için beklemesin artık, tamamen kalkısın ortadan.” İşte bu durumda da DEALLOCATE sözcüğü ile cursorümüzün bellekteki yerini boşaltabilmekteyiz. Tabi bu noktada şunu unutmamakta fayda var. DEALLOCATE ile bellekten kaldırdığımız bir cursor ü tekrar çağıramayız. Fakat aynı isimde yeni bir cursor tanımlayabiliriz.

DEALLOCATE OrnekCursor

Oluşturduğumuz bu Cursor lerde tanımlamalarımıza göre tanımladığımız Cursor un nasıl saklanacağı, verilere ne şekilde erişeceği, alan kullanımları, verilerin güncellenebilir olup olmamasına kadar çeşitli kısıtlamalar getirebiliyoruz.

Şimdi seçeneklerimizi sırası ile inceleyelim :

CURSOR SCOPE : Burada iki seçeneğimiz vardır.

1 ) GLOBAL : Her yerden ulaşılabilir.

2 ) LOCAL : Kullanılan Contexte göre erişilebilir. Context ; Cursorun deklarasyonunu içeren SQL ifadelerinin yığınları anlamına gelmektedir. Örneğin Stored Procedurede yerel bir Cursor kullanıyorsak stored procedure bittiğinde otomatik olarak hafızayı boşaltır. Cursore verdiğimiz hiçbir referansa artık ulaşılamaz.  Tanımladığımız Crsor için herhangi bir kapsama alanı belirtmediğimiz sürece veritabanımızın varsayılan değeri GLOBAL dir. Tabi hem LOCAL hemde GLOBAL cursorlarımızı aynı isimle tanımlamamızda mümkündür.

CURSOR OKUMA : Buradada iki seçeneğe sahibiz.

1 ) FORWARD_ONLY : Bu seçenekte gezinme sadece bir satırdan diğer bir satıra doğru olabilmekte. Bir satırı seçtiğimiz zaman tekrar çağıramamaktayız.

2 ) SCROLL : Bu seçenek ise bize farklı gezinme yolları sağlamaktadır. Örneğin tanımladığımız Cursor ü dönen sonuç kümesinin ilk yada son satırına götürebiliriz.

Buradada herhangi bir seçeneği belirmezsen Cursor Okuma için varsayılan değer FORWARD_ONLY dir.

CURSOR TYPE : Bu kez dört seçeneğe sahibiz 🙂

1 ) STATIC : Tanımladığımız Cursorümüzün erişebildiği verilerin geçici bir kopyası oluşturulur.Cursorda verilerin değiştirilmesine izin vermez.

2 ) KEYSET : Veri değiştirilmesine izin verir.

3 ) DYNAMIC : Veri değiştirilmesine izin verir fakat veriler geçici olarak depolanmaz.

4 ) FAST_FORWARD : Sadece okuma izni verir. FORWARD_ONLY okuma olayını kullanmaktadır.

CURSOR VERİ OKUMA : Tanımladığımız Cursorün verileri değiştirip değiştiremeyeceğine izin verip vermeyeceğini, eğer verecekse concurrencynin nasıl yapılacağını ayarlayabilmekteyiz.

1)  READ_ONLY : Sadece okunabilir. Verilerin değişimini yasaklar.

2 )  SCROLL_LOCKS : Bu seçenekte eğer satırımız salt okunur değilse veri erişimine izin verir.

3)  OPTIMISTIC :  ( SCROLL_LOCKS gibi kilitli olmayan satırların dışında ) verileri değiştirme iznini açar. Fakat dışarıdan erişilip güncelleme işlemi yapılırsa elbetteki sonuç negatif olacaktır.

CONVERSION VARNING : İhtiyaç duyabileceğimiz bazı durumlarda SELECT ifadesinin başka bir tipe çevrilemesi imkan dahilindedir. Bu nedenle dönen sütunlar çeşitlilik gösterebilmektedir. TYPE_WARNING ifadesi ile uyarı mesajı verdirebiliriz. Verileri değiştiren Cursorları kullandığımızda ikinci bir seçenek ise FOR UPDATE OF dur. Sözcükten sonra değiştirilmesine izin verilen sütunlar bir ” , ” (virgül) sonrasında yazılır. Bu sayede bazı stünları klitleyebiliriz.

Cursorlar ile sonuçlar arasında nasıl geziniriz ?
Verileri Cursorlar ile nasıl değiştiririz ?

Bu gibi işlemleri ise Cursor lar yazı dizimizin ikinci bölümünde yani bir sonraki makalemizde paylaşmaya gayret göstericem. Bu yazı serimizin ilki uygulamadan ziyade biraz daha terimler vs.. ler ile ilgili paylaşımlar içerdi. Yani ezber gerektiren oldukça sıkıcı bir makale oldu sanırım sizin için. Fakat uygulamalarımız için bunları bilmemizin gerekliliğini elbette dile getirmeme gerek yok sanırım 🙂

// Mahmut TEMUR hocanın sitesinden alıntıdır.

Yazar : Fatih KARATAŞ

Fatih KARATAŞ

1983 Erzurumlu doğumlu.Tekirdağ / Çerkezköy’de oturuyor.Trakya Üniversitesi Bilgisayar Programcılığı mezunu.MSCE ve MCDP eğitimleri aldı.Özel sektörde bilgi işlem sorumlusu olarak çalışıyor.

Fatih KARATAŞ

1983 Erzurumlu doğumlu.Tekirdağ / Çerkezköy'de oturuyor.Trakya Üniversitesi Bilgisayar Programcılığı mezunu.MSCE ve MCDP eğitimleri aldı.Özel sektörde bilgi işlem sorumlusu olarak çalışıyor.

You may also like...

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir