Kas
19
2011

Oracle Veri Tabanında Sequence ve Trigger(Tetikçi) Kullanımı 2

           Önceki yazımızda hazırladığımız hizmetler talosuna kayıt eklerken her kayıt için eklendiği cihaz ip’si ve saatiyle birlikte kayıt işlemi yapan saklı yordam yazalım.

           Saklı yordam üzerinde işlem yapılacak hesabın  hesap idsi ile değişiklik miktarı parametre olarak alıyor.

            Hareket tablosunda hiç kayıt yok ise hesap yeni açılmış ve bakiyesi 0 olarak kabul ediliyor. Kayıt olmadığında select sorgusu  “no_data_found” hatası fırlatılıyor  bizde onu yakalayıp önceki_bakiye alanını 0 yapıyoruz.

             Insert işlemi yaperken Hareket_Seq sequence’inden  değeri alıp kaydedebiliyoruz. Önceki yazıda yazdığımız Hizmet_Seq_Trig  tetikçisini silelim. Silmezsek İnsert işlemi yapıldığında Hareket_Seq.Nextval  hem Hizmet_Seq_Trig hem saklı yordamımızda çalışacağı için id iki iki artar.

CREATE OR REPLACE PROCEDURE HAREKET_LOG (HESAP_NO          NUMBER,
                                         CEKILEN_MIKTAR    NUMBER)
AS
   ESKI_MIKTAR   NUMBER;
   YENI_MIKTAR   NUMBER;
BEGIN
   SELECT YENI_BAKIYE
     INTO ESKI_MIKTAR
     FROM HAREKET
    WHERE HAREKET_ID = (SELECT MAX (HAREKET_ID)
                          FROM HAREKET
                         WHERE HESAP_ID = HESAP_NO);

   YENI_MIKTAR := ESKI_MIKTAR - CEKILEN_MIKTAR;

   IF YENI_MIKTAR > -100
   THEN
      INSERT INTO HAREKET (HAREKET_ID,
                           HESAP_ID,
                           YENI_BAKIYE,
                           ESKI_BAKIYE,
                           TARIH,
                           IP)
           VALUES (HAREKET_SEQ.NEXTVAL,    --hareket_seq yeni id aliniyor
                   HESAP_NO,
                   YENI_MIKTAR,
                   ESKI_MIKTAR,
                   SYSDATE,
                   SYS_CONTEXT ('USERENV', 'IP_ADDRESS'));
   END IF;
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN  --Hareket kaydi yok ise hesap hiç kullanilmamistir.
      INSERT INTO HAREKET (HAREKET_ID,
                           HESAP_ID,
                           YENI_BAKIYE,
                           ESKI_BAKIYE,
                           TARIH,
                           IP)
           VALUES (HAREKET_SEQ.NEXTVAL,
                   HESAP_NO,
                   cekilen_miktar * (-1),
                   0,
                   SYSDATE,
                   SYS_CONTEXT ('USERENV', 'IP_ADDRESS'));
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE ('Beklenmeyen Hata ile Karsilasildi.');
END;

           Daha sonra EXEC HAREKET_LOG(1,10) ile saklı yoradımı çalıştırdığımızda ( Hesap tablosunda Hesap_id’si 1 olan kayıt olmalı. ) Hesap miktarı 100′un altına düşene kadar bakiyeden çıkartıyor.

Yorum yapabilirsiniz..

Yazar : Yunus Bayhan

En son haber ve ücretsiz eğitimlere ulaşmak için üye olabilirsiniz