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".

Dijagram izjave o donošenju odluka
Dijagram izjave o donošenju odluka

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
  • SLUČAJ
  • 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.

Naredba NESTED-IF

Naredba NESTED-IF

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.