Pl/SQL’in bir prosedürel(yordamsal) bir dildir ve zaten ismini de buradan almıştır. Yordamların da alt programlar(subprogram) olduğunu ve bu alt programların bir araya gelerek  daha büyük kodları meydana getirdiğini söyleyebiliriz. Alt programlar bağımsız(standalone) veya bir paket(package) içerisinde oluşturulabilir. Paket konusunu ileride anlatacağım için bağımsız alt programlar ile devam edeceğiz.

Bağımsız alt programlar  CREATE PROCEDURE ve CREATE FUNCTION şeklinde oluşturulabilir ve silmek için ise  DROP PROCEDURE ve DROP FUNCTION  işlemlerini kullanarak yapabiliriz. Fonksiyonlar konusunu ayrıntılı bir şekilde işleyeceğiz fakat yordamları anlamak için fonksiyon tanımı bize yararlı olacak.

Fonksiyon :  Fonksiyonlar parametre alan ve tek bir değer döndüren alt programlardır.

Prosedür  :  Prosedürler parametre alabilen fakat geriye herhangi bir değer döndürmeyen alt programlardır.

NOT : Şunu da söyleyebiliriz: İşlev açısından prosedürler java/c#’taki void metodlara, fonksiyonlar ise değer dönen (string, int, bool vs.) metodlara benzer.

Prosedür oluştururken kullanacağımız yapı aşağıdaki gibidir.

CREATE [OR REPLACE] PROCEDURE yordam_adı
[(parametre_adı [IN | OUT | IN OUT] parametre_tipi [, ...])]
{IS | AS}
BEGIN
  < yordam gövdesi >
END yordam_adı;

Örnek 1;

BEGIN
   dbms_output.put_line('Hello World!');
END;
/

Örnek 2;

CREATE OR REPLACE PROCEDURE greetings
AS
BEGIN
   dbms_output.put_line('Hello World!');
END;
/

Aslında bu işlemi biz Örnek 1 gibi de yapabiliriz, Örnek 1’de sadece başında prosedür create işlemi yapılmadı çünkü bizim yazdığımız bir anonim blok yapısıydı.

Peki Örnek 2’de ne yaptık, öncelikle prosedürümüzü oluşturduk fark ettiyseniz REPLACE gibi bir ifade var ve bu ifade eğer bu isimde bir prosedür daha önceden oluşturulmuş ise yeni oluşturulan ile yer değiştirir aslında bir nevi günceller.

Prosedür çalıştırılırken aşağıdaki yapı kullanılır.

EXECUTE greetings;

Yukarıda görüldüğü gibi execute ifadesi ile oluşturmuş olduğumuz prosedürümüzü çalıştırır ve içerisine yazdığımız işlemlerin sonucunu görürüz.Ayrıca aşağıdaki gibi  execute demeden bir begin end; bloğu içerisinde prosedürümüzü çağırmamız da çalışmasını sağlar.

BEGIN
  greetings;
END;

Prosedür silinirken aşağıdaki işlem uygulanır.

DROP PROCEDURE greetings;

PARAMETRE MODLARI

PL/SQL prosedürlerinin parametre alabildiğini söylemiştik. Parametrelei farklı modlar halinde almak mümkün.

MOD Açıklama
IN Programımıza bir değer gönderir. Bilinen parametre modudur.
OUT Programımızdan belirttiğimiz değeri geri döndürür.
IN OUT Programımıza bir değer gönderir ve aynı zamanda bu değişkenin değişerek geri dönme ihtimali olduğunu gösterir.

NOT : OUT ile IN OUT arasındaki fark tahmin edeceğiniz gibi, OUT gönderilen parametreye dışarıda değer atanmış bile olsa, prosedürün içinde bu değerin kullanılamaması.

NOT : Procedure de değer dönmez derken  IN OUT ile istediğiniz kadar değer alabilirsiniz.. ama değer dönmez derken kastettiğimiz: RETURN bir değeri yoktur ve bir değişkene eşitleyemezsiniz.

Yani bir fonksiyon için, şeklinde bir komut yazabiliyorken, prosedürlerde böyle bir şey söz konusu değildir.

v_degisken =: f_hesapla;

Örnek 1;

DECLARE
   a number;
   b number;
   c number;

	PROCEDURE sum(x IN number, y IN number, z OUT number) IS
	BEGIN
		IF x > y THEN
			z:= x-y;
		ELSE
			z:= x+y;
		END IF;
	END; 

BEGIN
   a:= 23;
   b:= 45;
   sum(a, b, c);
   dbms_output.put_line('Sonuc : ' || c);
END;
/

Yukarıdaki örnekte a değişkeni b’den büyükse a değişkeni b’den çıkartılır.b değişkeni a’dan büyükse b değişkeni ile a toplanır.

Örnek 2;

DECLARE
	a number;

	PROCEDURE squareNum (x IN OUT number) IS
		BEGIN
			x := x * x;
		END; 

BEGIN
	a:= 23;
	squareNum (a);
	dbms_output.put_line('Kare Kokunun Degeri of (23): ' || a);
END;
/

Yukarıdaki örnekte ise IN OUT paramresini kullanarak a değişkeninin karesini aldık.

Parametre Pozisyonunu İşaret Etme(POSITIONAL NOTATION)

Prosedüre parametre verirken direk değişkeni işaret edebiliriz.Bunu iki örneğin karşılaştırmasını yaparak anlatırsak çok daha kolay anlaşılacağını düşünmekteyim

DECLARE
   acct INTEGER;
   amt  REAL;
   PROCEDURE credit_acct (acct_no INTEGER, amount REAL) IS ...
BEGIN
   credit_acct(acct, amt);                  	                        -- positional notation
   credit_acct(amount => amt, acct_no => acct);       -- named notation
   credit_acct(acct_no => acct, amount => amt);       -- named notation
   credit_acct(acct, amount => amt);                          -- mixed notation

Yukarıdada görüldüğü gibi acct_no parametresi acct değişkenini işaret eder. Amount parametresi ise amt değişkenini işaret eder.

İkinci örnekteki üçüncü kod named notantion, tüm parametreler değişkeni işaret ediyor ise named nottantion oluyor.

İkinci örnekteki beşinci kod ise mixed notantion, paramtereler de hem değişkeni işaret ediyor hem de hemde değişkeni direk parametreye yazılırsa mixed nottantion oluyor.

Yararlı olması Dilegiyle …
Yazar : Mustafa Bektaş Tepe

Kaynaklar;
http://www.tutorialspoint.com/plsql/plsql_basic_syntax.htm
https://developersdaily.wordpress.com
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/
https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/toc.htm
https://oracle-base.com/articles/misc/introduction-to-plsql

Loading