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];
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ğerdö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ı;
VARRAY aşağıdaki şekildende anlaşılacağı gibi birden fazla aynı tipte degişkeni bir dizi içinde hafızada(memory) ard arda tutan yapıdır(koleksiyon).
Array’ın faydasını anlamak için internette bulduğum bir örneği kullanacak olursak çok daha iyi anlaşılacağını düşünmekteyim; bir bilgisayar programı yaptığınızı düşünün. Kullanıcının 100 değer girmesi isteniyor. Girilen bütün bu sayıların farklı aşamalardan geçeceğini ve bu yüzden hepsini ayrı bir değişkende tutmamız gerektiğini varsayalım. Bu durumda ne yapardınız? a0, a1, a2, …, a99 şeklinde 100 tane değişken tanımlamak elbette mümkün; ama oldukça zahmetli olurdu. Sırf değişkenleri tanımlarken kaybedeceğiniz zamanı düşünürseniz ne demek istediğimi anlarsınız. Bunun için alternatif bir çözümün gerektiği mutlak!
Çok sayıda değişkenin gerektiği durumlarda, diziler imdadımıza yetişir. (Dizi, İngilizce kaynaklarda array olarak geçer.) 100 değişken tanımlamamızın gerektiği yukardaki örneğe dönelim. Tek tek a0, …, a100 yaparak bunu nasıl yazacağınızı zaten biliyorsunuz. Şimdi tek satırda dizi tanımlayarak, bunu nasıl yapacağımızı görelim:
CREATE OR REPLACE TYPE test_array IS VARRAY(100) of number;
Varray aslında bir veri tipidir ve bunu oluşturmak için aşağıdaki formatı kullanıyoruz.
CREATE OR REPLACE TYPE varray_ismi IS VARRAY(n) of<elementp_tipi>
NOT : PL/SQL bloğunun içinde dizileri(array) aşağıdaki gibide oluşturabiliriz.
TYPE varray_ismi IS VARRAY ( n ) OF < element_tipi >
varray_ismi : varray’e vereceğimiz isimdir.
n : varray’in maksimum eleman sayısı
element_tipi : varray’in içindeki elemanların tipinin ne olacağı.
Örnek;
CREATE OR REPLACE TYPE namearray AS VARRAY (3) OF VARCHAR2 (10);
TYPE namearray IS VARRAY(5) OF VARCHAR2(10);
Type grades IS VARRAY(5) OF INTEGER;
DECLARE
type namesarray IS VARRAY(5) OF VARCHAR2(10);
type grades IS VARRAY(5) OF INTEGER;
names namesarray;
marks grades;
total integer;
BEGIN
names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
marks:= grades(98, 97, 78, 87, 92);
total := names.count;
dbms_output.put_line('Total '|| total || ' Students');
FOR i in 1 .. total LOOP
dbms_output.put_line('Student: ' || names(i) || 'Marks: ' || marks(i));
END LOOP;
END;
/
Yukarıdaki örnekte isimlerin tutulduğu namesarray‘i ve isimlere ait notların tutulduğu grades‘imiz var. Görüldüğü gibi oluşturduğumuz değişkenlerin tipini oluşturduğumuz varray tipinde(names ve marks) tanımlıyoruz. Ardından oluşan array’imizin elemanlarını tanımlıyoruz. Ardından da döngüler de öğrendiğimiz for loop ile array’in eleman sayısı kadar (count ifadesi ilgili arrayin kaç elemandan oluştuğu bilgisini verir) ekrana isimleri ve notları yazdırıyoruz.
Örnek 2;
DECLARE
CURSOR c_test_array is
SELECT name FROM test_array;
type c_list is varray (6) of test_array.name%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_test_array LOOP
counter := counter + 1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter ||'):'||name_list(counter));
END LOOP;
END;
/
Yukarıda da görüldüğü gibi tablonun name sütununu bir diziye(array) atıyor ve kullanıyoruz.
NOT : yukarıdaki 2 örnektede count ve extend metodunu kullandık bu metodların hepsini koleksiyon(collection) konusunda göreceğiz.
Yararlı olması Dilegiyle … Yazar : Mustafa Bektaş Tepe
Bir veya birden fazla işlem satırını, bir koşula bağlı olarak, belirlisayıda veya bir koşul sağlandığı sürece tekrarlayarak çalıştıran kalıplara döngü adı verilir. Yani aşağıda görünen şekil gibi koşulumuz sağlanıyorsa döngümüz devam edecek sağlanmıyorsa döngü sonlanacaktır.
Döngü Tipi
Açıklama
PL/SQL Basic LOOP
PL/SQL Temel LOOP yapısında koşulumuz sağlanmadığında loop içinden çıkma komutu ile döngümüzü bitiririz.
PL/SQL While LOOP
WHILE LOOP mantığında ise basic loop ile aynı şekilde çalışır fakat burada şart sağlanmadan loop içine giremezsiniz basic loop içerisinde 1 defa girilmiş oluyor.
PL/SQL FOR LOOP
FOR LOOP yapısında belirlediğimiz sayıda loop içinde dönebiliriz.
Program komutları yazıldığı sırada akar. Ama çoğunlukla, bu akımı yönlendirmek gerekir. Bu iş için denetim yapılarından koşulları kullanabiliriz. Program akışını, belli mantıksal konullara göre istenen yöne saptıran denetim yapılarıdır.
Aşağıda şekil incelediğimizde condition yazan yer çalışmasını istediğimiz kodun çalışması için gereken koşul belirtiliyor eğer bu koşul doğru ise o zaman conditional code içinde sunduğumuz kodumuz çalışıyor ama koşul yanlış ise bu şekle göre programımız sonlanıyor.
Aşağıdaki çizelge de PL/SQL ‘de bulunan koşullu ifadeler bulumaktadır.
İfade
Açıklama
IF-THEN
IF- THEN- END IF;
Bu yapı if ‘in ardından belirtilen koşul sağlandığında then’in ardından gelen kod bloğu çalışır ve end if ile blok sonlanır. Zaten if’in ardındaki koşul sağlanmamış ise direk if then end if bloğu biter.
IF-THEN-ELSE
IF-THEN-ELSE – END IF;
Bu koşul yapısında ise if koşuluna bir alternatif oluşturuyoruz.Yani eğer ilk koşul yanlış ise ya da null ise else’e git oradaki kodu çalıştır diye komut vermiş oluyoruz. Bu yapı sayesinde koşul sağlansın ya da sağlanmasın sonunda herhangi bir kod ile bir aksiyon alıyoruz.
IF-THEN-ELSEIF
IF-THEN-ELSEIF-ELSEIF-ELSE-END IF;
Bu koşul yapısında birden fazla koşul için kodunuzu destekleyebilirsiniz. Örnek vermek gerekirse notu 0 ile 40 arasındakiler için bir işlem 40 ile 60 arasındakiler için farklı bir işlem 60 ile 80 arasındakiler için farklı bir işlem bunların dışındaki şartlar için de başka bir ihtimal gibi uzatabiliriz.
CASE
CASE
Bu koşul yapısında bir değişkenin istenilen koşullardeki değerlerine göre kod blokları çalıştırılıyor.