MySql’ in gelişmesiyle birlikte 5.0 versiyonu ile yanlış hatırlamıyorsam artık içine MsSql’ de olduğu gibi SP(Store Procedure) yazmaya başlayabildik. Sql yani veritabanı dünyasında zaten hep bir yok MsSql daha iyidir yok MySql daha iyidir diye bir yarış vardır. Hepsi aslında kendi içlerinde belli koşul ve şartlar sağlandığında iyidir ve hızlı çalışır. Dikkat ederseniz Oracle’ yi bu kavgaya dahil etmedim çünkü herkesin kabul etsin yada etmesin ortak görüşlerinden biri Oracle’ nin gerçekten hepsinden de iyi olduğu yönündedir ki bende buna sonuna kadar katılıyorum.
Fakat bana soracak olursanız ben oyumu MySql’ den yana kullanırım. MySql, MsSql ‘den bazı konularda daha geç gelişme göstersede mevcuttaki core çekirdek kararlılığı bazı durumlarda MsSql ‘e göre bir çok fayda sağlamakta. Dediğim gibi biraz daha yavaş gelişiyor olması bir dez avantajı şimdi gelelim bu veritabanında da MsSql ‘deki gibi bir SP ‘nin nasıl yazılacağını görelim.
Baştan belirtmeliyim ki MySql ‘de SP yazarken MsSql ‘deki alışkanlıklarınızı bir tarafa bırakmanız gerekli. Şimdi MySql ‘de örnek bir SP tanımlaması yapalım;
CREATE PROCEDURE SpCalculateInvoice(IN BeginDate DATETIME,IN EndDate DATETIME,IN UserName VARCHAR(250))
BEGIN
END
Burada göreceğiniz gibi dışarıdan değer almak için kullanacağımız değişkenlerimizin başına “IN” ifadesi konmuş. Mysql ‘de SP tanımlaması yaparken bu bir zorunluluktur ve aşağıdaki taglerden biri mutlaka bulunmalıdır.
- IN : Değişken sadece dışarıdan SET edilir ve içerideki işlemlerde sadece kullanılır değeri ezilemez !!!
- OUT : Değişken sadece içeriden SET edilir dışarıdan değer alamaz !!!
- INOUT : Değişken her iki taraftanda SET edilebilir. Hem dışarıdan SET edilip SP içine değer aktarmada kullanılır hemde SP içerisinden SET edilerek dışarı değer vermede.
Şimdi bunlarla ilgili birer örnek yapalım. İlk başta zaten ben IN ifadesini kullanmış ve bir SP tanımlamış idim. Şimdi bunu nasıl size dışarıdan çağıracağımı göstereyim;
CALL SpCalculateInvoice('2013-04-05 12:00:00','2013-04-05 21:00:00','bmeric');
Eğer aşağıdaki gibi bir SP oluşturursak;
CREATE PROCEDURE ikinciProcedure(OUT toplam INT)
BEGIN
select Count(*) into toplam from users;
END
Bu oluşturduğumuz prosedürde users tablosundaki kullanıcıların sayılarını sayıp elde edilen sonucu toplam değişkenine atıyor. Bu SP ‘nin çağırışı yukarıdaki gibi olmayacak. OUT ‘lu SP ‘leri çağırmanın koduda aşağıdaki gibidir;
SET @sonuc = 0;
CALL ikinciProcedure(@sonuc);
SELECT @sonuc;
Şimdi bir tek INOUT ile yazılan SP ‘mizi tanımlamak kaldı. İşte oda aşağıdaki gibidir;
CREATE PROCEDURE ucuncuProcedure (INOUT sayi INT)
BEGIN
SET sayi = (SELECT COUNT(*) FROM users WHERE id=sayi);
END
Bu SP ‘nin çağırımıda aşağıdaki gibidir;
SET @sonuc = 5;
CALL ucuncuProcedure(@sonuc);
SELECT @sonuc;