Cursor lar 2
Merhaba arkadaşlar;
Bir önceki makalemizde Cursor'lara ilişkin genel bir tanımlama gerçekleştirdik ve Curorlar tanımlama şekli ile Cursor seçeneklerine değindik. Bu makalemizde ise Curor lar ile sonuçlar arasında nasıl geziniriz, verileri cursor lar ile nasıl değiştirirz bu konuları incelemeye çalışacağız.
Veriler içerisinde Cursor lar ile gezinmek oldukça kolaydır. Cursor lar ile veriler arasında gezinme işlemini FETCH anahtar kelimesi ile gerçekleştirmekteyiz.
Örnek : FETCH FROM CursorIsmi
Cursorlar ile veriler arasında gezinirken dilersek bu verileri değişkenlerede atayabilmekteyiz.
Örnek : FETCH FROM CursorIsmi INTO @Degisken1, @Degisken2, @Degisken3
Arka planda sütünlardaki değerler sırası ile kopyalanmaktadır. Satırlardaki verileri sırası ile işleyebildiğimizden dolayı tahmin edeceğiniz üzere bu yöntemi Stored Procedure ler ilede kullanabilmekteyiz. Eğer Cursor u SCROLL seçeneği ile kullanıyorsak nevigation seçeneği ilede dilediğimiz şekilllerde veriler arasında dolaşabilme şansına sahibimiz demektir. Şimdi bu cümle üzerine biraz duralım ve bir örnekle konuyu sağlamlaştıralım.
SÖZDİZİMİ : FETCH nevigation FROM CursorIsmi
Peki bu söz diziminde belirttiğimiz nevigation seçenekleri nelerdir ?
1 - Next : Cursorun sonuçlarda bir sonraki satıra geçmesini sağlar.
2 - Prior : Cursor u önceki satıra geçmesini sağlar.
3 - First : Sonuç kümesinde Cursor un ilk satıra gelmesini sağlar.
4 - Last : Sonuç kümesinde Cursor un son satıra geçmesini sağlar.
5 - Absolute n : Cursorun sonuç kümesinde başlangıçtan itibaren n ( belirtilen sayı kadar ) sonraya gitmesini sağlar. Burada dikkat etmemiz gereken konu ise eğer n değeri eğer negatif (-) bir değerde ise sonuç kümesinde en sondan belirtilen n satır kadar önceye döndürmektedir. Eğer n sıfır (0) ise herhangi bir satır döndürmez.
6 - Relative n : Bu seçenek ise Cursoru bulunduğu pozisyona göre hareket ettir. Yani cursoru mevcut pozisyonundan belirtilen n satır sonrasına götürür. Absolute de olduğu gibi Relative seçeneğinde de tanımlanan n değeri eksi (-) ise mecut pozisyonundan belirtilen n satır öncesine götürür. Eğer tanımlanan n değeri sıfır (0) ise mevcut satır döndürülür.
ÖRNEK : FETCH NEXT FROM CursorIsmi
Bu örnekte Cursoru sonuç kümesinde bir sonraki satırı almaktayız.
ÖRNEK : FETCH FIRST FROM CursorIsmi
Bu örnekte ise ilk satırı almaktayız.
Peki işlemlerimizin olmazsa olmaz durumlarından olan hata durumlarında ne yapacağız ? Elbetteki sonuç kümlerinde gezinirken; gezinmelerimizde satır dönmeyen durumlarla karşılaşmamız kuvvetle muhtemeldir. Silinmiş bir satır olabilir, yeri değiştirilmiş bir satır olabalir. Bu durumlarda haliyle satır dönmeyecektir. İşte bu durumlarda @@FETCH_STATUS değişkeninden yardım istemekte ve bu değişkenden dönen değer ile sorunu anlayabiliriz. @@FERCH_STATUS değişkeninden 3 farklı değer dönmektedir.
Eğer dönen değer 0 ise işlemin başarılı bir şekilde tamamlandığını anlamaktayız. Dönen değer 1 ise gitmek istediğimiz satırın Result Set'in dışında olmasından dolayı işlemin başarısız olduğunu söyler. Bu durumdada Cursor u bir önceki satıra götürür. Eğer dönen değer 2 ise istenilen satırın kayıp olmasından dolayı işlemin başarız olduğunu belirtir.
Dilerseniz bir örnek üzerinden makalemize devam edelim.
CREATE PROCEDURE ProcedureIsmi
AS
BEGIN
DECLARE CursorIsmi CURSOR LOCAL FOR ( SELECT KolonIsmi FROM TabloIsmi)
OPEN CursorIsmi
DECLARE @Alan1 varchar (250)
DECLARE @Alan2 varchar (MAX) ( Burada belirteceğimiz karakter sayısından fazla bir sonuç çıkarsa sonuç başarısız olacaktır. Bunu önlemek için MAX değerini kullandık. )
SET @Alan2 = ' '
FETCH NEXT FROM CursorIsmi INTO @Alan1
WHILE @@FETCH_STATUS = 0 ( İşlem başarılı ise )
BEGIN
SET @Alan2 = @Alan2 + ' , ' + @Alan1
FETCH NEXT FROM CurorIsmi INTO @Alan1
END
SET @Alan2 = SUBSTRING (@Alan2, 3, LEN (@Alan2) - 2 )
CLOSE CursorIsmi
DEALLOCATE CursorIsmi
SELECT @Alan2 AS Alan2
END
GO
Dilerseniz bir örnekde verileri değiştrimek üzerine verelim bu makalemizi burada sonlandıralım.
DECLARE CursorIsmi CURSOR FOR ( SELECT * FROM TabloIsmi )
OPEN CursorIsmi
FETCH NEXT FROM CursorIsmi
IF (@@TETCH_STATUS = 0 )
DELETE FROM TabloIsmi WHERE CURRENT OF CursorIsmi
CLOSE CursorIsmi
DEALLOCATE CursorIsmi
Yapmış olduğumuz bu işlem ile DECLARE CursorIsmi CURSOR FOR ( SELECT * FROM TabloIsmi ) satırında ki SELECT * FROM TabloIsmi sorgusundan dönen ilk satırı silmiş olduk.Tabi burada özellikle dile getirmekte fayda farki eğer silinecek olan satır FOREIGN KEY ile başka bir alanla ilişkilendirildiyse silme işlemi gerçekleşmeyecekti.
Bu durum UPDATE işlemi içinde aynıdır.
Bu makalemizde Cursor lara ilişkin makale serimizin ikincisinde Cursor lar ile veriler arasında gezinebilme ve verileri değiştirebilme konularına değindik.
Faydalı olması dileğiyle bir sonraki makalemizde görüşmek dileğiyle.
Saygılarımla
Takip Ediyorum
Faydalı Projeler
Yorumlar
Sizde Yorumda Bulunun
Konuya dair fikir ve sorularınızı paylaşın