PL/SQL Programlama – 9

Merhaba, PL/SQL yazılarına devam ediyoruz. Bu yazıda Prosedür ‘lere başlıyoruz.

PROSEDÜRLER:

  • Prosedürler bir veritabanı objesidir.
  • Yapacağı işleme dair yazdığımız kodu bir defa derlenip veritabanına kayıt edildikten sonra kod içerisinde çağırışığ kullanılır.
  • Özetle yapılacak bir işlem için sürekli aynı kod yazılmamış olur.

 

Prosedür Oluşturma:

Oluşturacağımız Prosedürü “CREATE” komutu ile oluşturabiliriz. Silerken de benzer şekilde “DROP” komutu ile silebiliriz. Örnek üzerinden ilerleyeyim.

 

CREATE [OR REPLACE] PROCEDURE test AS

BEGIN

dbms_output.put_line('Prosedür başarılı');

END;

/

Oluşturduğumuz bir prosedürü çalıştırmak için EXEC veya EXECUTE komutlarını kullanmalıyız. Eğer prosedürümüz parametrelerden oluşuyorsa, çalıştırırken bu parametreleri de belirtmek zorundayız.

EXEC @parametre_adi(parametre1,….);

PARAMETRE KULLANIMI:

Az öncek örnekte parametre kullanımına küçük bir giriş yaptık diyebiliriz. Bunun yanısıra parametrelerinde kullanım modları vardır bunlar; IN/OUT/IN OUT

IN Modu:
  • Default olarak kullanılan moddur
  • Prosedür içinde yer alan tanımlı değerleri kabul eder
  • Bize değer döndürür.

Bir örnek üzerinen daha net anlayabiliriz. Calisanlar tablosunda bir kaydımıza değer vererek değiştirelim.

Önce tablonun ilk haline bakalım.

create or replace procedure SYS.calisan_guncelle(cal_id in number,cal_adi in varchar2) as 
BEGIN
UPDATE Calisanlar set AD=cal_adi where ID=cal_id;
commit;
END;
/

 

Prosedürü çalıştıralım.

EXEC calisan_update(100,’Onur’);

OUT Modu:

Prosedür içerisinde yer alan parametrelerin kullanımı sonucu bize belirlediğimiz değişken üzerinden değer döndüren moddur. Prosedürü oluştururken OUT tipinde bir parametre ile değişebilir değer almamızı sağlar.

Örnek üzerinden inceleyelim.

Calisanlar tablosunda verdiğimiz değerlerde ve OUT parametresi kullanarak maaş güncellemesi yapalım.

Tablonun ilk haline bakalım

DECLARE
calisan_soyad VARCHAR2(20);
calisan_no NUMBER(3):=100;
artis NUMBER(6):=200;
PROCEDURE maas_artis(calisan_id IN NUMBER,miktar IN NUMBER,calisan_ad OUT VARCHAR2)
IS
BEGIN
UPDATE Calisanlar SET maas=maas+miktar where ID=calisan_id;
SELECT SOYAD into calisan_ad from Calisanlar where ID=calisan_id;
END maas_artis;
BEGIN
maas_artis(calisan_no,artis,calisan_soyad);
DBMS_OUTPUT.PUT_LINE(calisan_soyad ||' İçin maaş artışı gerçekleşti');
END;
/

 

Görüldüğü gibi Prosedür başarılı şekilde çalışmış gözüküyor, Peki maaş neden 200 artaması gerekirken 400 arttı diyeceksiniz. Ben kontrol etmek için yukarıda bir kere daha kodu çaıştırdım bu yüzden toplamda iki kere çalışmış oldu yani bir hata yok 🙂

IN OUT Modu:

Çalıştıktan sonra kod içerisinde bir değer döndürür. Parametrenin aldığı değer kullanılmayıp başka değer ile işlem yapılabilir.

Örnek ile inceleyelim. Gün içinde geçen dakika sayısını bulalım.

create or replace procedure dk_hesap(tarih DATE,saat IN OUT NUMBER,dk IN OUT NUMBER)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(saat||' / '||dk);
saat:=to_NUMBER(to_char(tarih,'hh24'));
dk:=to_char(tarih,'mi');
DBMS_OUTPUT.PUT_LINE(saat||' : '||dk);
END;
/


DECLARE 
v_saat NUMBER:=12;
v_dakika NUMBER:=60;
BEGIN
dk_hesap(sysdate,v_saat,v_dakika);
DBMS_OUTPUT.PUT_LINE('Toplam Dakika '|| (v_saat*60+v_dakika));
END;
/

Bu yazının sonuna geldik, bir sonraki yazıda prosedürlerde kalan kısa konumuzu da işleyip fonksiyonlara başlıyor olacağız.

Görüşmek üzere..

Deniz Parlak

Hi, I'm a Computer Engineering student in Dumlupınar University.I will graduate next year. I did an internship TurkNet Telecominication Company in 2018 June- 2018 September. I had experience Linux/Unix system, SQL Server Management , SSRS, Mysql Database Management,Troubleshooting performance issues in Linux. I also interested Oracle database and technologies. I want to work as Oracle DBA after my University. I am practicing Unix, Exadata, Orace Cloud, Oracle RAC, Dataguard, EBS, Oracle BI and etc and i hope the articles will be helpful. Any questions, or support please write email deniz.parlak@yahoo.com

Leave a Reply

Your email address will not be published. Required fields are marked *