17 Eylül 2010 Cuma

MySql Saklı Yordamları ve Parametre Varyasyonları

Bu yazıda, Mysql saklı yordamları(Stored Procedures - SP) parametreler ile yazmayı öğreneceğiz. Aslında bu programcı arkadaşların zaten aşina oldukları, değer ve referansla geçirmek konularının MySQL'deki yansısıdır.


Bu yazıda, Mysql saklı yordamları(Stored Procedures - SP) parametreler ile yazmayı öğreneceğiz. Aslında bu programcı arkadaşların zaten aşina oldukları, değer ve referansla geçirmek konularının MySQL'deki yansısıdır. Yazı devamında, konuyu pekiştirecek örneklere de yer verilecektir.
Saklı prosedürleri genellikle, ihtiyaç duyulan bazı parametrelerle yazarız. Parametreler, saklı yordamımızı daha kullanışlı ve dinamik hale getirir. Mysql'de, üç tip parametre seçeneği vardır. Bunlar IN,OUT,INOUT 'dır.

IN : Bu parametre, varsayılan parametre tipidir. IN, saklı yordama geçirilen değişkeni gösterir; ancak bu değişken üzerinde herhangi bir değişiklik yapamaz. Örnek olarak, değeri 10 olan id isimli değişkenimizi, saklı yordamımıza aktardığımızı düşünelim.


GetAll(id)

Saklı yordamımızı çalıştırdıktan sonra dahi, id isimli değişkenimizin değeri halâ 10'dur; Üstelik, GetAll yordamı , id isimli değişkenin içeriğine müdahale edebilecek kudrete sahip olmasına rağmen...

OUT : Bu mod, saklı yordamın içeriği değiştirebileceği değeri gösterir, ve işlem sonunda değiştirilen değeri programa geri gönderir.

INOUT : Adında anlaşılacağı üzere, bu mod, IN ve OUT modlarının birleşik halidir. Bu mod sayesinde, parametreyi saklı yordama geçirebilir;dilerseniz yeni değeri ile tekrar programa geri çağırabilirsiniz.

Aşağıdaki örneği izleyelim:


DELIMITER //
  CREATE PROCEDURE GetOfficeByCountry(IN countryName VARCHAR(255))
     BEGIN
   SELECT city, phone 
   FROM offices
   WHERE country = countryName;
     END //
  DELIMITER ;


Görüleceği üzere, countryName parametresini IN modunda kullandık. Ve tipini de varchar olarak

belirleyip, 255 karakter olarak boyutlandırdık.

Saklı yordamımızın gövdesinde ise, biz, countryName parametresi ile aktardığımız ülke adına ait bütün ofisleri sorguluyoruz.

Örneğin siz, Amerika Birleşik Devletleri'ndeki tüm ofisleri sorgulamak istiyorsunuz:


CALL GetOfficeByCountry('USA') 


Sorgumuz, ABD'deki tüm ofisleri yanıt olarak göndürdü.


İkinci örnekte ise, sipariş durumlarına(gönderildi,çözüldü,iptal edildi,kişiye ulaştı,işlem görüyor ve tartışmalı) göre siparişleri sayan ve toplam miktarı çıkarın bir saklı yordam yazacağız. İşte saklı yordamımız:



DELIMITER $$
CREATE PROCEDURE CountOrderByStatus(
   IN orderStatus VARCHAR(25),
   OUT total INT)
     BEGIN
   SELECT count(orderNumber)
   INTO total
   FROM orders
   WHERE status = orderStatus;
     END$$
  DELIMITER ;


CountOrderByStatus yordamı, iki parametreye sahip.

  •  orderStatus, IN modundaki bu parametre sayesinde, sipariş durumunu yordama geçirebiliyoruz
  •  total parametresi ise, OUT modunda birparametredir. Bu parametre, sipariş durumunagöre toplam sipariş miktarını saklamaktadır.


Gönderilen siparişlerin toplam sayısını almak için aşağıdaki SQL cümleciğini kullanıyoruz.


CALL  CountOrderByStatus('Shipped',@total);
 SELECT @total AS  total_shipped;  


İşlenen siparişleri görüntülemek için aşağıdaki sorguyu kullanıyoruz:

 

CALL CountOrderByStatus('in  process',@total);
SELECT @total AS  total_in_process;




Üçüncü saklı yordamımızda ise, INOUT parametresini test edeceğiz. Bu saklı yordamı, kendisine geçirilen string(metin) değerin tüm kelimelerin ilk harfini büyük harf yaparak geri döndürmektedir. Saklı yordamın kodu aşağıdaki gibidir:




DELIMITER $$
 CREATE PROCEDURE `Capitalize`(INOUT str VARCHAR(1024))
 BEGIN
  DECLARE i INT DEFAULT 1;
  DECLARE myc, pc CHAR(1);
   DECLARE outstr VARCHAR(1000) DEFAULT str;
   WHILE i <= CHAR_LENGTH(str) DO
   SET myc = SUBSTRING(str, i, 1);
   SET pc = CASE WHEN i = 1 THEN ' ' 
          ELSE SUBSTRING(str, i - 1, 1) 
     END;
   IF pc IN (' ', '&', '''', '_', '?', ';', ':', '!', ',', '-', '/', '(', '.') THEN
       SET outstr = INSERT(outstr, i, 1, UPPER(myc));
   END IF;
   SET i = i + 1;
  END WHILE;
  SET str = outstr;
 END$$
 DELIMITER ;  


Capitalize isimli saklı yordamımızı kullanmak için ise, aşağıdaki kodu kullanacağız.




SET @str = 'mysql stored procedure tutorial';
 CALL Capitalize(@str);
 SELECT @str;
  


İşlem sonunda @str değeri, "Mysql Stored Procedure Tutorial" olacaktır.

Kolaylıklar dilerim.

Hiç yorum yok: