Prosedürleri öğrenirken fonksiyonlarla ilgili olarak geriye bir değer döndürür demiştik.
Yeri gelmişken internette karşılaştığım prosedür veya fonksiyonların önemiyle ilgili güzel bir örnek; Bir işlemi birden çok yaptığınızı düşünün. Her seferinde aynı işlemi yapan kodu yazmak oldukça zahmetli olurdu. Fonksiyonlar veya prosedürler, bu soruna yönelik yaratılmıştır. Sadece bir kereye mahsus yapılacak işlem tanımlanır. Ardından dilediğiniz kadar, bu fonksiyonu çağırırsınız. Üstelik fonksiyonların yararı bununla da sınırlı değildir. Fonksiyonlar, modülerlik sağlar. Sayının asallığını test eden bir fonksiyon yazıp, bunun yanlış olduğunu farkederseniz, bütün programı değiştirmeniz gerekmez. Yanlış fonksiyonu düzeltirsiniz ve artık programınız doğru çalışacaktır. Üstelik yazdığınız fonksiyonlara ait kodu, başka programlara taşımanız oldukça basittir.
Bir fonksiyon aşağıdaki şekilde oluşturulur.
CREATE [OR REPLACE] FUNCTION fonksiyon_adi [(parametre_adi[IN | OUT | IN OUT] parametre_tipi [, ...])] RETURN donen_degiskenin_tipi {IS | AS} BEGIN < fonksiyonun gövdesi> END [fonksiyon_adi];
Örnek1 ; Aşagıdaki gibi bir tablomuz olsun.
Tablo count unu veren Fonksiyonumu oluşturuyorum.
CREATE OR REPLACE FUNCTION totalCustomers RETURN number IS total number(2) := 0; BEGIN SELECT count(*) into total FROM test_array; RETURN total; END; /
Fonksiyonumuzu çağırırken yapmamız gereken tek şey fonksiyonun adını yazıp gereken parametreleri içerisine uygun tiplerde vermek ve ardından fonksiyondan dönen veriyi bir değişken içerisine alarak kullanmak. Şimdi bir örnekle bu yazdıklarımı pekiştirelim.
DECLARE c number(2); BEGIN c := totalCustomers(); dbms_output.put_line('Total no. of Customers: ' || c); END; /
Örnek 2; Yazdığımız fonksiyonu nasıl çağırdığımızı yukarda gördük. Şimdi parametre alan bir fonksiyonu oluşturma ve çağırma işlemlerine bir örnek ile devam edelim.
DECLARE a number; b number; c number; FUNCTION func_result(x IN number, y IN number) RETURN number IS z number; BEGIN IF x > y THEN z:= x-y; ELSE z:= x+y; END IF; RETURN z; END; BEGIN a:= 23; b:= 45; c := func_result(a, b); dbms_output.put_line('Sonuc : ' || c); END; /
Özyineli(Recursive) Fonksiyonlar
Bir fonksiyon içerisinden, bir diğerini çağırabiliriz. Rekürsif fonksiyonlar, fonksiyon içersinden fonksiyon çağırmanın özel bir hâlidir. Rekürsif fonksiyon bir başka fonksiyon yerine kendisini çağırır ve şartlar uygun olduğu sürece bu tekrarlanır. Rekürsif, Recursive kelimesinden geliyor ve tekrarlamalı, yinelemeli anlamını taşıyor. Kelimenin anlamıyla, yaptığı iş örtüşmekte.
DECLARE num number; factorial number; FUNCTION fact(x number) RETURN number IS f number; BEGIN IF x=0 THEN f := 1; ELSE f := x * fact(x-1); END IF; RETURN f; END; BEGIN num:= 6; factorial := fact(num); dbms_output.put_line(' Factorial '|| num || ' is ' || factorial); END; /
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