Cursor; Türkçe adıyla imleç yada işaretçi, bir veri seti içerisinde o andaki satırı işaret etmektedir. Örneğin kullanıcılar tablosunda aktif olan kullanıcıları çekerek her bir kullanıcı bilgisine satır satır ulaşıp, bu bilgilere göre işlemler yapabiliriz.
Mysql’de cursor’lar stored procedure’lar ve fonksiyonlar içerisinde kullanabilirler.
Bir örnek ile pekiştirecek olursak:
Yeni bir stored procedure oluşturarak işe başlayalım.
CREATE PROCEDURE `prcCursor_Ornek` ()
BEGIN
declare iDone int;
declare crs_ID int;
declare crs_ad varchar(50);
declare crs_soyad varchar(50);
block_cursor: BEGIN
DECLARE pcuUsers CURSOR FOR
select ID, ad, soyad from kullanicilar where active = 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET iDone = 1;
SET iDone = 0;
OPEN pcuUsers;
lUserIterator: LOOP
FETCH pcuUsers
INTO crs_ID, crs_ad, crs_soyad;
IF 1 = iDone THEN
LEAVE lUserIterator;
END IF;
update kullanicilar set email = concat(crs_ad, '.', crs_soyad, '@ismailaktas.com')
where ID = crs_ID;
END LOOP lUserIterator;
CLOSE pcuUsers;
END block_cursor;
END
Yukarıdaki örnekte öncelikle gerekli deklarasyonları yaparak değişken tanımlarını yapıyoruz. Burada dikkat edilmesi gereken bazı noktalar var.
Cursor’da ifade edilen her bir alan(field)’ın karşılığı olacak bir değişken olmalı ve bu değişkenin de veri tipi cursor’dan gelen alanın veri türü ile aynı olmalıdır.
Örnekte göreceğiniz üzere; ID = crs_ID, ad = crs_ad, soyad = crs_soyad eşleşmesi sağlanmış ve veri tiplerinin de aynı olduğu gözlemlenmiştir.
8. satırda Cursor’ı içinde barındıracak bir block alan yapılmış ve tüm kod bu alanın içerisine dahil edilmiş. Bu zorunlu değildir ama kod okunurluğu ve kodu diğer kodlardan izole etmek için kullanışlı bir yöntemdir.
9. satırda cursor tanımlanıyor
10. satırda kayıt setinin oluşturulacağı sorgu yazılıyor. Burada aktif durumda olan kullanıcılar çekiliyor.
11. Herhangi bir kayıt bulunamadığında iDone değişkenine 1 atanıyor.
12. iDone = 0 yapılarak sorun olmadığında döngünün devam etmesi sağlanıyor.
13. Cursor açılıyor ve Loop işlemi başlıyor. Loop lUserIterator isimli bir değişken ile işaretleniyor.
15. Cursor’daki veriler Fecth komutu ile çekiliyor.
16. kayıt setindeki alanlar yukarıda tanımlanan değişkenlere atanıyor. Burada aynı sırada ve aynı veri tipinde olması çok önemlidir.
17. Eğer kayıt seti sonuna ulaşıldıysa yani cursor son satırı da döndüyse leave komutu ile loop (döngü) dan çıkılıyor.
21. Cursor’ların genel kullanım amacı çekilen veri setini satır satır dönerek çeşitli amaçlar için kullanmaktır. Burada da kullanıcının adı, soyadı ve @ismailaktas.com bilgileri concat komutu birleştirilerek kullanici tablosundaki email alanına atılıyor.
Burada verdiğim örneği başka yöntemlerle hatta çok daha kolay da yapabilirdik. Amaç cursor’ların mantığını anlamak 🙂
Umarım faydalı olmuştur.