Mysql’de Cursor Kullanımı
Kayıtlara satır satır erişmek ve bu kayıtlar üzerinde işlem yapabilmemiz için kullanılır.Mysql de Cursorlar Stored Procedure,Trigger ve Fonksiyonlarla birlikte kullanılabilirler.Cursor bir select ifadesi için tanımlanır ve select işleminin sonucunda dönen her sutun içinbir değişken tanımlanır. Ve döngü içine sokularak bu datalar üzerinde istediğimiz işlemiyaparız. Update , insert , vs gibi.Şimdi Örnek üzerinde anlamaya çalışalım.
CREATE DEFINER=`root`@`localhost` PROCEDURE `td_albumSongsUpdate`()BEGINDECLARE id_ int;DECLARE done INT DEFAULT 0;DECLARE albumID_ varchar(30);DECLARE cur1 CURSOR FOR SELECT id,albumID FROM Albums;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN cur1;REPEATFETCH cur1 INTO id_,albumID_;update td_albumSongsset as_albumID=albumID_where as_ID=id_ ;UNTILdoneEND REPEAT;close cur1;END$$
Root userının Call edebileceği `td_albumSongsUpdate` isimli bir procedureyarattık. Ve procedurun içinde ;id_ :int değişken tanımladık,
done : int bir değişken tanımladık default değer olarak 0 atadık.
AlbumID_:varchar(30) diye bir değişken tanımladık
Sonra cur1 isimli bir Cursor declare ettik ve SELECT id,albumID FROM Albums;sql’inin sonucunda dönen değerleri bu cursor’a atadık. Ve en son olarak dadone değişkenine select işlemi sonucu dönen satırın en sonuna ulaştığında(yani artık satır bulamadığında) done değişken değerini set edip, 1 yapmasını söyledik.Sonra cur1 ,cursorını açtık.Ve Repeat-Until döngüsü içinde done değişken değerinin1 oluncaya kadar devam etmesini söyledik.Bu döngü içinde de albumSongs tablosuna update işlemi yaptırdık ve cur1 isimli cursor’ı kapattık.Bu procedure de ise ;
Albums tablosundan 3 farklı kolon çekiliyor ama 3 farklı cursora(buradaki amaç farklı kullanımları görmek) değerler atanıyor. Ve Whiledöngüsü içinde belli kriterlere göre kontroller yapıldıktan sonra songskolonu 25 er karakterlere bölünerek td_albumSongs tablosunainsert yapılıyor.CREATE DEFINER=`root`@`localhost` PROCEDURE `albumSongs`()BEGINDECLARE songs TEXT;DECLARE album varchar(30);DECLARE preview varchar(300);DECLARE AlID int;DECLARE done INT DEFAULT 0;DECLARE cur1 CURSOR FOR SELECT albumSongs FROM Albums;DECLARE cur2 CURSOR FOR SELECT albumID FROM Albums;DECLARE cur3 CURSOR FOR SELECT id FROM Albums ;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN cur1;OPEN cur2;OPEN cur3;REPEATFETCH cur1 INTO songs;FETCH cur2 INTO album;FETCH cur3 INTO AlID;set @basla=1;set @sayac=25;set @a=1;set @b=101; set @id=1;while (@a<@b) doinsert into td_albumSongs (as_ID,as_sayac,as_albumID,as_songID,as_songPreview)values (AlID,@id,album,substring(songs,@basla,@sayac),’url’);set @a=@a+1;set @basla=@basla+25;set @sayac=@sayac+25;set @id=@id+1;end while;UNTIL done END REPEAT;close cur1;close cur2;close cur3;delete from td_albumSongs2where length(as_songID)=0;END$$
Tayfur BÖLERDatabase Administratorwww.mysqlsupport.net