MySQL 5.0 ve Üzeri StoredProcedure,Trigger,Function,View

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

MySQL 5.0 ve Üzeri StoredProcedure,Trigger,Function,View

Mesaj gönderen vkamadan »

Daha önce forumda konuşulmuştu MySQL de artık çağa ayak uydurup bir veri tabanında olmasada olur ama olursa çok daha iyi olur diyebileceğimiz özellikler arasında olan Stored Procedure (SP olarak anılacak) , Stored Function (function olarak anılacak) View ve Trigger desteğini 5.0 sürümünden itibaren sağladı.Bende konuyla ilgili biraz geçte olsa fırsat bulup biraz araştırma ve test yaptım, bu makalede de yüzeysel olarak SP,Function,View ve Trigger yazımı ve kullanımı hakkında başlangıç seviyesinde bilgi vermeyi amaçlıyorum.

Gerekli Araçlar
MySQL 5.0
http://dev.mysql.com/get/Downloads/MySQ ... .gr/mysql/
SP,Function,view ve Trigger Destekletyen Freeware bir MySQL GUI aracı
http://www.polisoftonline.com/download/SQLyog50.exe
Not:SQLyog50 vakti zamanında freeware olarak dağıtılıyordu ozaman indirmiştim ama şimdi nette bulamadım elimdekini veriyorum.

MySQL 5.0 ve SQLYog kurulduğunu varsayıp devam ediyorum,
Öncelikle ek bir kaç bilgiyle başlayalım mySQL ilk kurulduğunda sadece root@localhost kullanıcısıyla gelir bu demektirki siz server harici bir sistemden MySQL e erişemezsiniz dolayısıyla root@% kullanıcsını tanımlamayı unutmayın.
Mysql5.0 ile birlikte information_shema adında bir system database gelir.bu Db yi açıp incelediğinizde tanımladığınız sp,function,view,trigger gibi elementlerin bu tablolar içinde tutulduğunu ayrıca yaratılan DB ler tablolar ve alanları ve bu alanların yetki düzeyleri ayrıca indexler hakkında bilgilerin tutulduğu sistem tabloları olduğunu göreceksiniz.

Stored Procedure
Basit bir SP nin yapısı aşağıdaki gibidir,

Kod: Tümünü seç

DELIMITER $$;

CREATE PROCEDURE spDeneme (IN GirisParametresi varchar(20) OUT cikisParametresi varchar(20))
BEGIN
    . .. .. ... . .
END$$

DELIMITER ;$$
Öncelikle IN ile belirtilen değişkenler SP ye giriş parametreleri OUT ile belirtilen değişkenler çıkış değerlerini ifade eder,
hiç giriş yada çıkış parametresi alamayan SP lerde yazabilirsiniz.

Girilen bir sayının negatif mi pozitifmi olduğunu gösteren bir SP yazalım (Not Bu Stored Function ile çok daha basit yazılabilir ama amaç öğrenmek)

Kod: Tümünü seç

DELIMITER $$;
CREATE PROCEDURE spIslem (in deger int , out sonuc varchar(20))
 BEGIN
  IF deger<0 THEN SET sonuc='NEGATIF';
  ELSEIF deger>0 THEN SET sonuc='POZITIF';
 END IF;
END$$
 DELIMITER ;$$
Yukarıdaki örneği incelediğimizde IF THEN ELSEIF ve END IF yapılarına dikkat edin bu yapı hakkında bilgi sahibi olucaksınız,
En önemlisi ise değişkenlerimize değer atamak için SET ifadesini kullandığımıza dikkat edin,

Şimdi bu Sp yi kullanalım ,

Kod: Tümünü seç

CALL spIslem(10 , @sonuc);
SELECT @sonuc;

//Ekranda "POZITIF" yazıcaktır.
Sp çalıştırmak için CALL deyimini kullanıyoruz ve eğer dönüş değeri değişkense, dönüş değerlerini almak için @ ifadesiyle rastgele bir isimde değişkene alıyoruz ve select ile gösteriyoruz.
NOT: @ ifadesiyle yarattığımız değişkenler oturum süresince hafızada kalır ve kullanılabilir.

Şimdi de tblDeneme isimli tablomuzu sorgulayan ve geriye veri kümesi döndüren bir Sp yazalım ve parametre almasın bu SP.

Kod: Tümünü seç

DELIMITER $$;
CREATE PROCEDURE spTablosec ()
BEGIN
select *from tblDeneme;
END$$
DELIMITER ;$$
Kullanmak için,

Kod: Tümünü seç

CALL spTablosec();
gördüğümüz gibi veri seti dönen SP ler kullanmakta oldukça basit.

Ve unutmadan SP lere parametre geçtiğimiz değişkenleri sorgu içinde basitçe şu şekilde kullanabilirsiniz,

Kod: Tümünü seç

DELIMITER $$;
CREATE PROCEDURE spTablosec (IN kriter varchar(20))
BEGIN
select *from tblDeneme where alan=kriter;
END$$
DELIMITER ;$$
Kullanmak için,

Kod: Tümünü seç

CALL spTablosec("KriterDeğeri");

Evet SP ler hakkında biraz bilgi sahibi olduğumuza göre birazda Function tanımlarına göz atalım.

Stored Function

MySQL de basit bir Functionun yapısı şöyledir,

Kod: Tümünü seç

DELIMITER $$;
CREATE FUNCTION fncKareAl (sayi1 INT) 
RETURNS INT
  BEGIN
   RETURN sayi1 * sayi1;
  END$$
DELIMITER ;$$
görüldüğü gibi giriş parametrelerini tipleriyle belirtiyoruz ve dönüşün tipini belirtiyoruz ve function içinde RETURN deyimi ile sonucu bildiriyoruz.

örnek olarak şöyle kullanalım , tblDeneme tablomuzda sayi adınde bir INT alanımız olsun ve select işlemiyle bu sayının karesini alalım.

Kod: Tümünü seç

SELECT fncKareAl(sayi) , alan1,alan2 from tbldeneme
kullanımı hakkında bilgi veren bu örneğide inceledikten sonra view lere göz atalım,

VIEW

MySQL de basitçe bir view şöyle tanımlanır,

Kod: Tümünü seç

CREATE VIEW vDeneme AS (select *from tblDeneme)
bukadar basit, kullanımıda tıpkı diğer RDBMS lerde olduğu gibi bir tablo gibi

Kod: Tümünü seç

select *from vDeneme
Trigger

MySQL de her tabloya INSERT , DELETE , UPDATE olaylarının sonrasında ve Öncesinde çalışacak şekilde AFTER / BEFORE özellikli Trigger tanımlası yapılabilir,
tblDeneme tablomuzun alan1 sahası NULL ise bu alana "BOŞ" yazıcak INSERT işleminden önce çalışacak basit bir TRIGGER şu şekilde yazılabilir,

Kod: Tümünü seç

DELIMITER $$;
 CREATE TRIGGER trgKontrol BEFORE INSERT tblDeneme
    FOR EACH ROW
       BEGIN
          IF NEW.alan1 ISNULL then NEW.alan1="BOŞ"; 
          END IF;
       END $$
DELIMITER;$$    
Şimdilik bukadar inşallah yararlı olur.
İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

MySQL 5.1.x versiyonlarında trigger, procudure ve function larda değişkenleri field adı olarak kullanamıyorsunuz. Uğraşacak arkadaşlar varsa bilgileri olsun istedim.

Kod: Tümünü seç

a = 'field1';
select a from tablom
gibi bir yapı mümkün değil. Diğer veri tabanlarında execute ile bu yapılabiliyor. Ayrıca normal sql içerinsinde de bu yapı çalışıyor ama nedense trigger,function'da olmuyor. Sitesinde daha sonra geliştirilecek diyor.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Volkan kardeş eline emeğine sağlık. Başlangıç noktası için güzel bir paylaşım oldu. :)
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Rica ederim Recep abi faydalı olabiliyorsam ne mutlu bana.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

mkysoft yazdı:MySQL 5.1.x versiyonlarında trigger, procudure ve function larda değişkenleri field adı olarak kullanamıyorsunuz. Uğraşacak arkadaşlar varsa bilgileri olsun istedim.

Kod: Tümünü seç

a = 'field1';
select a from tablom
gibi bir yapı mümkün değil. Diğer veri tabanlarında execute ile bu yapılabiliyor. Ayrıca normal sql içerinsinde de bu yapı çalışıyor ama nedense trigger,function'da olmuyor. Sitesinde daha sonra geliştirilecek diyor.
Parametre geçtiğim alan adını seçen bir Sp örneği şöyle yapılabileceğini öğrendim,

Kod: Tümünü seç

DELIMITER $$


CREATE PROCEDURE `spAlanSec`(IN alan varchar(20))
BEGIN
     SET @sorgu = CONCAT("SELECT ", alan, " FROM hesapkart");
     PREPARE stmt FROM @sorgu;
     EXECUTE stmt;
    END$$

DELIMITER ;
Bunu ,

Kod: Tümünü seç

CALL spAlanSec('hes_ad1');
şeklinde çağırdığımda hesapkart tablosunun hes_ad1 alanını seçerek sorgu çalıştırdı,

Kod: Tümünü seç

CALL spAlanSec('hes_ad1,hes_kod');
Şeklinde çağırdığımda iki alanıda seçti, PREPARE ve EXECUTE ile tamamen değişken cümleleri çalıştırabiliyoruz.

Yani şöyle bir SP yi,

Kod: Tümünü seç

DELIMITER $$


CREATE PROCEDURE `spAlanSec`(IN alan varchar(100))
BEGIN
     SET @sorgu = alan;
     PREPARE stmt FROM @sorgu;
     EXECUTE stmt;
    END$$

DELIMITER ;

Bu şekilde çalıştarabiliriz,

Kod: Tümünü seç

CALL spAlanSec ('SELECT *from TABLOADI ');
Kolay gelsin.
Volkan KAMADAN
www.polisoft.com.tr
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

Re: MySQL 5.0 ve Üzeri StoredProcedure,Trigger,Function,View

Mesaj gönderen seho »

Merhaba,

SP leri MySQL de kullanmaya yeni başladım ve açık söylemek gerekirse işlerimide fazlası ile kolaylaştırdı. Fakat benim şöyle bir sorunum var. SP ye gönderdiğim değerlere göre filtrelemeler yapıyorum ve sonuçları gönderiyorum. Her sorgumda gönderdiğim sayfa değerine göre LIMIT ile belirli kayıtlar arasını alıyorum. Sorunum ise şu : LIMIT kullandığım için dönen kayıt sayısı belli, ben benim o anki sorgu şartlarıma uyan tüm kayıtların sayısını nasıl alırım? Bu sayıyı alabilirsem sayfalamayı yapacağım.

Cümleten iyi çalışmalar...
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: MySQL 5.0 ve Üzeri StoredProcedure,Trigger,Function,View

Mesaj gönderen Battosai »

SP içinde ilk önce bir değişkene limitsiz dönen sonuç sayısını al sonra limitli olanları......sayfalamada çok lazım değilse gereksiz sorgu çevirmeye gerek yok...ben sayfalamayı sadece sayfa bazında gösteriyorum yani öteki sayfa değince sayfa numarasını artırıyorum toplam sayfa olarak göstermiyorum tabi tercih sana ait....
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

Re: MySQL 5.0 ve Üzeri StoredProcedure,Trigger,Function,View

Mesaj gönderen seho »

Merhaba,

Dediğinizi denedim ama malesef bir türlü kayıtsayısını aktardığım değişkeni dışarı aktaramadım. MySQL sürümü 5.0.67 bundan mı kaynaklanıyor bilmiyorum ama procedure tanımlama satırında OUT şeklinde değişken tanımlamama izin vermiyor. Belki bilmiyorum daha önce hiç başıma böyle bir sorun gelmediği için OUT kullanmayı bilmiyorum.

Sayfalamayı ben mecburen yapmak zorundayım. Bu sayfamda kullanıcıya illaki bilgi vermek zorundayım :(. Elnizde dışarı bu şekilde değer aktarmayı gösteren bir örnek varsa ve paylaşırsanız sevinirim.

Cümleten iyi çalışmalar...
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: MySQL 5.0 ve Üzeri StoredProcedure,Trigger,Function,View

Mesaj gönderen vkamadan »

Merhaba @seho MySQL de oturum değişkenlerinin kullanım pratikliği şuan karşılaştığın durumda dahil olmak üzere bir çok noktada hızlı çözümler üretmek için oldukça ideal, yapman gereken procedurene OUT parametresi tanımlayıp toplam kayıt sayını bu değişkene atamam, uygulama dışındanda bir oturum değişkeni ile değeri okumam, şöyle örnekleyelim,

Kod: Tümünü seç


CREATE PROCEDURE `sptest` 
(
  IN   `kriter`  varchar(20),
  OUT  `sayi`     int
)
BEGIN 
SELECT SUM(1) INTO sayi from tabloadi where kriteralani=kriter;
END;
Delphi ortamındanda şöyle çağırabilirsin,

Kod: Tümünü seç

  with qSPCagir do
 begin
  close;
sql.clear;
sql.add('CALL sptest(:kriter , @sayidegisken)');
parambyname('kriter').asstring:='kriter değeri';
execute; // SP çağırıldı ve OUT parametresi yaratılan "sayidegisken" isimli oturum dğeişkenine aktarıldı

close;
sql.clear;
sql.add('select @sayidegisken');
active:=True; // az önce çağrılan SP nin oluşturduğu oturum değişkenini seçtik
ShowMessage(Fields[0].Asstring);

end;
Umarım açıklayıcı olmuştur.
İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Cevapla