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. |
NESTED IF-THEN-ELSE | İç içe if’li bloklar oluşturabilirsiniz. |
IF-THEN
DECLARE v_num1 NUMBER := 5; v_num2 NUMBER := 3; v_temp NUMBER; BEGIN -- v_num1 sayisi v_num2 den buyukse if sarti saglanacaktir sartinda ise v_num1 ile v_num2 degerleri degistirilmistir IF v_num1 > v_num2 THEN v_temp := v_num1; v_num1 := v_num2; v_num2 := v_temp; END IF; -- Son durumda v_num1 ve v_num2 nin degerlerini ekrana yazdiririz DBMS_OUTPUT.PUT_LINE ('v_num1 = '||v_num1); DBMS_OUTPUT.PUT_LINE ('v_num2 = '||v_num2); END;
DECLARE emp_id hr.employees.employee_id%TYPE := 100; emp_salary hr.employees.salary%TYPE; BEGIN --employee_id si 100 olan personelin maasini degiskenimize veririz SELECT salary INTO emp_salary FROM hr.employees WHERE employee_id = emp_id; --maasi 30000 den az ise 1000 artiririz IF emp_salary <= 30000 THEN UPDATE hr.employees SET salary = salary + 1000 WHERE employee_id = emp_id; DBMS_OUTPUT.put_line ('Maas Guncellendi'); END IF; END;
IF-THEN-ELSE
Diagramı aşağıdaki gibidir. 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.
DECLARE v_exam_score NUMBER := &exam_score; BEGIN IF v_exam_score >= 70 THEN DBMS_OUTPUT.PUT_LINE ('Sinavi '||v_exam_score||' puanla gectiniz'); ELSE DBMS_OUTPUT.PUT_LINE ('Sinavdan '||v_exam_score||' puanla kaldiniz'); END IF; END;
DECLARE v_num NUMBER := &sv_user_num; BEGIN /* MOD(x,y) fonksiyonu iki sayısal deger alır ve x’in y’ye bölümünden kalanı verir. Eger mod sonucu 0 ise sayimiz cift sayi 0 dan farkli ise tek sayidir */ IF MOD(v_num,2) = 0 THEN DBMS_OUTPUT.PUT_LINE (v_num||' cift sayi'); ELSE DBMS_OUTPUT.PUT_LINE (v_num||' tek sayi'); END IF; DBMS_OUTPUT.PUT_LINE ('Bitti'); END;
NOT : NULL sonuç dönersede ELSE altındaki komutlar çalıştırılır.
DECLARE v_num1 NUMBER := 0; v_num2 NUMBER; BEGIN IF v_num1 = v_num2 THEN DBMS_OUTPUT.PUT_LINE ('v_num1 = v_num2'); ELSE DBMS_OUTPUT.PUT_LINE ('v_num1 != v_num2'); END IF; END;
IF-THEN-ELSEIF
DECLARE a number(3) := 100; BEGIN -- a nin degeri 10 a esit mi? IF ( a = 10 ) THEN -- eger 10 a esit ise asagidakini yaz dbms_output.put_line('Value of a is 10' ); -- a nin degeri 10 a esit degil ise 20 ye esit mi? ELSIF ( a = 20 ) THEN -- eger a 20 ye esit ise asagidakini yaz dbms_output.put_line('Value of a is 20' ); -- a nin degeri 10 a ,20 ye esit degil ise 30 a esit mi? ELSIF ( a = 30 ) THEN -- eger anin degeri 30 a esit ise asagidakini yaz dbms_output.put_line('Value of a is 30' ); ELSE --eger ne 10,ne 20,ne 30 hiçbirine esit degilse asagidakini --yaz dbms_output.put_line('a degeri yukaridakilerin hiçbirine eşit degil'); END IF; -- a nin degeri ne olursa olsun asagidakileri yaz dbms_output.put_line('a nin degeri: '|| a ); END; /
CASE
CASE ile ilgili diagram aşağıdaki gibidir. Bu koşul yapısında bir değişkenin istenilen koşullardeki değerlerine göre kod blokları çalıştırılıyor.
DECLARE notum char(1) := 'A'; BEGIN -- Case'imiz notum değerinin neye eşit olduğunu bulmak CASE notum -- notum 'A' ya eşit ise 'Muhteşem' when 'A' then dbms_output.put_line('Muhteşem'); -- notum 'B' ye eşit ise 'Çok iyi' when 'B' then dbms_output.put_line('Çok iyi'); -- notum 'C' ye eşit ise 'İyi' when 'C' then dbms_output.put_line('İyi'); -- notum 'D' ye eşit ise 'Geçer' when 'D' then dbms_output.put_line('Geçer'); -- notum 'F' ye eşit ise 'Kötü Kaldın' when 'F' then dbms_output.put_line('Kötü Kaldın'); -- Eğer caselerimden hiçbiri sağlanamadıysa o zaman -- 'Böyle bir not yok' mesajını ekrana basıyoruz else dbms_output.put_line('Böyle bir not yok'); END CASE; END; /
NESTED IF-THEN-ELSE
DECLARE a NUMBER (3) := 100; b NUMBER (3) := 200; BEGIN --CHECK THE BOOLEAN condition IF ( a = 100 ) THEN --IF condition IS TRUE THEN CHECK the following IF ( b = 200 ) THEN --IF condition IS TRUE THEN PRINT the following DBMS_OUTPUT . put_line ( 'Value of a is 100 and b is 200' ); END IF; END IF; DBMS_OUTPUT . put_line ( 'Exact VALUE of a is : ' || a ); DBMS_OUTPUT . put_line ( 'Exact value of b is : ' || b ); 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