Oracle PL/SQL IF THEN ELSE izjava: ELSIF, NESTED-IF
ล to su izjave o donoลกenju odluka?
Izjave o donoลกenju odluka su one koje ฤe odluฤiti o kontroli tijeka SQL izjave temeljene na uvjetima. Programeru daje bolju kontrolu nad sprjeฤavanjem izvrลกavanja odreฤenog koda (dijagram 1) ili odabirom ลพeljenog koda na temelju uvjeta (dijagram 2). Ispod je slikovni prikaz "Izjave o donoลกenju odluke".

Vrste izjava o donoลกenju odluka:
Oracle pruลพa sljedeฤe vrste izjava o donoลกenju odluka.
- AKO-ONDA
- AKO-ONDA-INAฤE
- AKO-ONDA-ELSIF
- UGNJEลฝฤENO-AKO
- Studije sluฤaja
- PRETRAลฝENI SLUฤAJ
IF-THEN izjava
Naredba IF-THEN se uglavnom koristi za izvrลกavanje odreฤenog dijela kodova samo kada je uvjet zadovoljen.
Stanje bi trebalo popustiti Booleova (toฤno/netoฤno). To je osnovna uvjetna izjava koja ฤe omoguฤiti ORACLE-u da izvrลกi/preskoฤi odreฤeni dio koda na temelju unaprijed definiranih uvjeta.
Sintaksa za IF THEN izjave:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_block> END if;
- U gornjoj sintaksi, kljuฤna rijeฤ 'IF' ฤe biti popraฤena uvjetom koji daje vrijednost 'TRUE'/'FALSE'.
- Kontrola ฤe izvrลกiti samo ako se stanje vrati .
- U sluฤaju uvjeta procjenjuje se na tada ฤe SQL preskoฤiti , i poฤet ฤe izvrลกavati kod pored bloka 'END IF'.
Biljeลกka: Kad god se uvjet procijeni na 'NULL', tada ฤe SQL tretirati 'NULL' kao 'FALSE'.
Primjer 1: U ovom primjeru ฤemo ispisati poruku kada je broj veฤi od 100. Za to ฤemo izvrลกiti sljedeฤi kod
Za ispis poruke kada broj ima vrijednost veฤu od 100, izvrลกavamo sljedeฤi kod.
DECLARE
a NUMBER :=10;
BEGIN
dbms_output.put_line(โProgram started.' );
IF( a > 100 ) THEN
dbms_output.put_line('a is greater than 100');
END IF;
dbms_output.put_line(โProgram completed.');
END;
/
Objaลกnjenje koda:
- Redak koda 2: Deklaracija varijable 'a' kao tipa podataka 'BROJ' i njeno inicijaliziranje s vrijednoลกฤu '10'.
- Redak koda 4: Ispis izjave โProgram je pokrenutโ.
- Redak koda 5: Provjera uvjeta, je li varijabla 'a' veฤa od '100.'
- Redak koda 6: Ako je 'a' veฤe od '100', tada ฤe se ispisati "a je veฤe od 100". Ako je 'a' manje od ili jednako 100, tada uvjet ne ispunjava, tako da se gornji iskaz za ispis zanemaruje.
- Redak koda 8: Ispis izjave "Program dovrลกen".
Izlaz koda:
Program started. Program completed.
Primjer 2: U ovom primjeru, ispisat ฤemo poruku ako je zadana abeceda prisutna u engleskim samoglasnicima (A, E, I, O, U).
Za ispis poruke kada je dati znak samoglasnik, izvrลกavamo sljedeฤi kod.
DECLARE
a CHAR(1) :=โuโ;
BEGIN
IF UPPER(a) in ('Aโ,'E','I','0','U' ) THEN
dbms_output.put_line(โThe character is in English Vowels');
END IF;
END;
/
Objaลกnjenje koda:
- Redak koda 2: Deklaracija varijable 'a' kao 'CHAR' tipa podataka veliฤine '1' i njeno inicijaliziranje s vrijednoลกฤu 'u'.
- Redak koda 4: Provjera uvjeta, da li je varijabla 'a' prisutna u listi ('A','E','I','O','U').
- Vrijednost 'a' pretvorena je u velika slova prije usporedbe kako bi usporedba bila neosjetljiva na velika i mala slova.
- Redak koda 5: Ako je 'a' prisutan na popisu, tada ฤe se ispisati izjava "Znak je u engleskim samoglasnicima". Ako uvjet nije uspio, tada ovaj program neฤe dati nikakav izlaz, buduฤi da izvan bloka IF-THEN nismo izdali nikakvu naredbu za ispis.
Izlaz koda:
The character is in English Vowels
Izjava IF-THEN-ELSE
- Izjava IF-THEN-ELSE uglavnom se koristi za odabir izmeฤu dvije alternative na temelju uvjeta.
- Ispod je prikaz sintakse izjave IF-THEN-ELSE.
Sintaksa za izjave IF-THEN-ELSE:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_blockl> ELSE -execute if the condition failed (returns FALSE) <action_block2> END if;
- U gornjoj sintaksi, kljuฤna rijeฤ 'IF' ฤe biti popraฤena uvjetom koji daje vrijednost 'TRUE'/'FALSE'.
- Kontrola ฤe izvrลกiti samo ako se stanje vrati .
- U sluฤaju stanja procjenjuje na tada ฤe se SQL izvrลกiti .
- U svakom sluฤaju, izvrลกit ฤe se jedan od dva akcijska bloka.
Biljeลกka: Kad god se uvjet ocijeni kao 'NULL', tada ฤe SQL tretirati 'NULL' kao 'FALSE'.
Primjer 1: U ovom primjeru ispisat ฤemo poruku bez obzira na to je li navedeni broj neparan ili paran.
DECLARE
a NUMBER:=11;
BEGIN
dbms_output.put_line (โProgram started');
IF( mod(a,2)=0) THEN
dbms_output.put_line('a is even number' );
ELSE
dbms_output.put_line('a is odd number1);
END IF;
dbms_output.put_line (โProgram completed.โ);
END;
/
Objaลกnjenje koda:
- Redak koda 2: Deklaracija varijable 'a' kao tipa podataka 'BROJ' i njeno inicijaliziranje s vrijednoลกฤu '11'.
- Redak koda 4: Ispis izjave โProgram je pokrenutโ.
- Redak koda 5: Provjera uvjeta je li modul varijable 'a' prema '2' jednak 0.
- Redak koda 6: Ako je '0', tada ฤe se ispisati "a je paran broj".
- Redak koda 7: Ako vrijednost modula nije jednaka '0', tada se vraฤa uvjet , pa ฤe se ispisati poruka "a je neparan broj".
- Redak koda10: Ispis izjave "Program dovrลกen"
Izlaz koda:
Program started. a is odd number Program completed.
Izjava IF-THEN-ELSIF
- Izjava IF-THEN-ELSIF uglavnom se koristi kada treba izabrati jednu alternativu iz skupa alternativa, gdje svaka alternativa ima svoje uvjete koje treba zadovoljiti.
- Prvi uvjeti koji se vraฤaju ฤe se izvrลกiti, a preostali uvjeti ฤe biti preskoฤeni.
- Izjava IF-THEN-ELSIF moลพe sadrลพavati blok 'ELSE' u sebi. Ovaj 'ELSE' blok ฤe se izvrลกiti ako niti jedan od uvjeta nije zadovoljen.
biljeลกke: ELSE blok je neobavezan u ovoj uvjetnoj izjavi. Ako nema bloka ELSE i niti jedan od uvjeta nije zadovoljen, kontroler ฤe preskoฤiti sve akcijske blokove i zapoฤeti s izvrลกavanjem preostalog dijela koda.
Sintaksa za IF-THEN-ELSIF izjave:
IF <conditionl: returns Boolean> THEN -executed only if the condition returns TRUE < action_blockl> ELSIF <condition2 returns Boolean> < action_block2> ELSIF <condition3:returns Boolean> < action_block3> ELSE โoptional <action_block_else> END if;
- U gornjoj sintaksi, kontrola ฤe izvrลกiti samo ako se uvjet1 vrati .
- Ako uvjet1 nije zadovoljen, regulator ฤe provjeriti uvjet2.
- Kontroler ฤe izaฤi iz IF-naredbe u sljedeฤa dva sluฤaja.
- Kada kontroler pronaฤe bilo koji uvjet koji se vraฤa . U tom sluฤaju, izvrลกit ฤe se odgovarajuฤi action_block i kontroler ฤe izaฤi iz ovog bloka IF-naredbe i zapoฤet ฤe izvrลกavanje preostalog koda.
- Kada niti jedan od uvjeta nije zadovoljen, then kontroler ฤe izvrลกiti ELSE blok ako postoji, a zatim ฤe izaฤi iz IF-naredbe.
Biljeลกka: Kad god se uvjet ocijeni kao 'NULL', tada ฤe SQL tretirati 'NULL' kao 'FALSE'.
Primjer 1: Bez bloka ELSE
U ovom primjeru ispisat ฤemo ocjenu na temelju zadanih ocjena bez drugih uvjeta (oznaka >= 70 ocjena A, ocjena >=40 i ocjena <70 ocjena B, ocjena >=35 i ocjena <40 ocjena C).
DECLARE mark NUMBER :=55; BEGIN dbms_output.put_line(โProgram started.โ ); IF( mark >= 70) THEN dbms_output.put_line(โGrade Aโ); ELSIF(mark >= 40 AND mark < 70) THEN dbms_output.put_line(โGrade B'); ELSIF(mark >=35 AND mark < 40) THEN dbms_output.put_line(โGrade Cโ); END IF; dbms_output.put_line(โProgram completed.โ); END; /
Objaลกnjenje koda:
- Redak koda 2: Deklaracija varijable 'oznaka' kao tipa podataka 'BROJ' i njeno inicijaliziranje s vrijednoลกฤu '55'.
- Redak koda 4: Ispis izjave โProgram je pokrenutโ.
- Redak koda 5: Provjera uvjeta1, je li 'oznaka' veฤa ili jednaka 70.
- Redak koda 7: Buduฤi da uvjet1 nije uspio, provjerava se uvjet2 '70>oznaka>=40โฒ.
- Redak koda 8: Condtition2 se vraฤa , stoga ฤe se ispisati poruka 'Ocjena B'.
- Redak koda12: Ispis izjave "Program dovrลกen".
- U ovom sluฤaju, uvjet3 'oznaka < 35' bit ฤe preskoฤen, jer je kontroler pronaลกao jedan uvjet koji vraฤa prije uvjeta3.
Izlaz koda:
Program started. Grade B Program completed.
Primjer 2: S blokom ELSE
U ovom primjeru ispisat ฤemo ocjenu na temelju zadanih ocjena s drugim uvjetom (oznaka >= 70 ocjena A, ocjena >=40 i ocjena <70 ocjena B, ocjena >=35 i oznaka <40 ocjena C, inaฤe 'Bez ocjene').
DECLARE mark NUMBER :=25; BEGIN dbms_output.put_line(โProgram started.โ ); IF( mark >= 70) THEN dbms_output.put_line(โGrade Aโ); ELSIF(mark >= 40 AND mark < 70) THEN dbms_output.put_line(โGrade B'); ELSIF(mark >=35 AND mark < 40) THEN dbms_output.put_line(โGrade C); ELSE dbms_output.put_line(โNo Gradeโ); END IF; dbms_output.put_line(โProgram completed.' ); END; /
Objaลกnjenje koda:
- Redak koda 2: Deklaracija varijable 'oznaka' kao tipa podataka 'BROJ' i njeno inicijaliziranje s vrijednoลกฤu '25'.
- Redak koda 4: Ispis izjave โProgram je pokrenutโ.
- Redak koda 5: Provjera uvjeta 1, je li 'oznaka' veฤa ili jednaka 70.
- Redak koda 7: Buduฤi da uvjet1 nije uspio, provjerava se uvjet2 '70>oznaka>=40โฒ.
- Redak koda 8: Buduฤi da uvjet2 nije uspio, provjerava se uvjet3 '40>oznaka>=35โฒ.
- Redak koda 11: Buduฤi da svi uvjeti nisu ispunjeni, kontrola ฤe sada provjeriti prisutnost ELSE bloka i ispisati poruku 'No Grade' iz ELSE bloka.
- Redak koda14: Ispis izjave "Program dovrลกen".
Izlaz koda:
Program started. No Grade Program completed.
Naredba NESTED-IF
- Naredba NESTED-IF u osnovi dopuลกta programerima da postave jedan ili viลกe 'IF' uvjeta unutar drugog 'IF' uvjeta osim normalnih izjava.
- Svaki uvjet 'IF' treba imati zasebnu izjavu 'END IF' koja oznaฤava kraj opsega tog odreฤenog .
- Naredba 'IF' smatrat ฤe najbliลพu naredbu 'END IF' krajnjom toฤkom za taj odreฤeni uvjet.
- Slikovni prikaz za NESTED-IF prikazan je ispod dijagrama.
IF <conditionl: returns Boolean> THEN โexecuted only if the condition returns TRUE <action block1 starts> IF <condition2: returns Boolean> THEN <action_block2> END IF; โEND IF corresponds to condition2 <action_blockl ends> END IF; โEND IF corresponds to condition1
Objaลกnjenje sintakse:
- U gornjoj sintaksi, vanjski IF sadrลพi joลก jednu IF naredbu u svom akcijskom bloku.
- Uvjet1 se vraฤa , tada ฤe se kontrola izvrลกiti i provjerava stanje1.
- Ako se uvjet2 takoฤer vrati , onda takoฤer ฤe se izvrลกiti.
- U sluฤaju uvjeta2 procjenjuje se na tada ฤe SQL preskoฤiti .
Ovdje ฤemo vidjeti primjer ugnijeลพฤenog Ifa โ
Primjer ugnijeลพฤene naredbe If: Najveฤi od tri broja
U ovom primjeru ispisat ฤemo najveฤi od tri broja pomoฤu izjave Nested-If. Brojevi ฤe biti dodijeljeni u dijelu za deklaraciju, kao ลกto moลพete vidjeti u donjem kodu, tj. Broj= 10,15 i 20, a maksimalni broj ฤe se dohvatiti koriลกtenjem ugnijeลพฤenih if naredbi.
DECLARE
a NUMBER :=10;
b NUMBER :=15;
c NUMBER :=20;
BEGIN
dbms_output.put_line(โProgram started.' );
IF( a > b)THEN
/*Nested-if l */
dbms_output.put_line(โChecking Nested-IF 1');
IF( a > c ) THEN
dbms_output.put_line(โA is greatestโ);
ELSE
dbms_output.put_line(โC is greatestโ);
END IF;
ELSE
/*Nested-if2 */
dbms_output.put_line('Checking Nested-IF 2' );
IF( b > c ) THEN
dbms_output.put_line(โB is greatest' );
ELSE
dbms_output.put_line(โC is greatest' );
END IF;
END IF;
dbms_output.put_line(โProgram completed.โ );
END;
/
Objaลกnjenje koda:
- Redak koda 2: Deklaracija varijable 'a' kao tipa podataka 'BROJ' i njeno inicijaliziranje s vrijednoลกฤu '10'.
- Redak koda 3: Deklaracija varijable 'b' kao tipa podataka 'BROJ' i njezino inicijaliziranje s vrijednoลกฤu '15'.
- Linija koda 4: Deklaracija varijable 'c' kao tipa podataka 'BROJ' i njeno inicijaliziranje s vrijednoลกฤu '20'.
- Redak koda 6: Ispis izjave โProgram je pokrenutโ (redak 6).
- Redak koda 7: Provjera uvjeta1, je li 'a' veฤe od 'b' (redak 7).
- Redak koda 10: Ako je 'a' veฤi od 'b, tada ฤe uvjet u 'nested-if 1' provjeriti je li 'a' veฤi od 'c' (redak 10).
- Redak koda 13: Ako je i dalje 'a' veฤi, tada ฤe se ispisati poruka 'A je najveฤi' (redak 11). Inaฤe, ako uvjet2 ne uspije, tada ฤe se ispisati 'C je najveฤi' (redak 13).
- Redak koda 18: U sluฤaju da uvjet1 vrati false, tada ฤe uvjet u 'nested-if 2' provjeriti je li 'b' veฤi od 'c' (redak 18).
- Redak koda 21: Ako je 'b' veฤe od 'c', tada ฤe se ispisati poruka 'B je najveฤi' (redak 19), inaฤe ako uvjet2 ne uspije, tada ฤe se ispisati 'C je najveฤi' (redak 21).
- Redak koda 24: Ispis izjave โProgram zavrลกenโ (redak 24).
Izlaz koda:
Program started. Checking Nested-IF 2 C is greatest Program completed.
Rezime
U ovom poglavlju smo nauฤili razliฤite izjave za donoลกenje odluka i njihovu sintaksu i primjere. Donja tablica daje saลพetak razliฤitih uvjetnih izjava o kojima smo raspravljali.
| TIP | OPIS | KORIล TENJE |
|---|---|---|
| AKO-ONDA | Provjerava Booleov uvjet, ako je TRUE kod u bloku 'THEN' ฤe se izvrลกiti. | Za preskakanje/izvrลกenje odreฤenog koda na temelju uvjeta. |
| AKO-ONDA-INAฤE | Provjerava Booleov uvjet, ako ฤe se izvrลกiti TRUE kod u bloku 'THEN', ako se izvrลกi pogreลกan kod u bloku 'ELSE'. | Najprikladnije u stanju 'OVO-ILI-ONO'. |
| AKO-ONDA-ELSIF | Provjerava Booleov uvjet redoslijedom. Izvrลกit ฤe se prvi blok u nizu koji vraฤa TRUE uvjet. Ako niti jedan od uvjeta u nizu nije TRUE, tada se izvrลกava kod u bloku 'ELSE'. | Koristi se za odabir izmeฤu viลกe od dvije moguฤnosti uglavnom. |
| UGNJEลฝฤENO-AKO | Dopuลกta jednu ili viลกe naredbi IF-THEN ili IF-THEN-ELSIF unutar druge naredbe IF-THEN ili IF-THEN-ELSIF. | Uglavnom se koristi u situaciji ugnijeลพฤenog stanja. |


