Oracle PL/SQL IF THEN ELSE Instrukcja: ELSIF, NESTED-IF

Czym sฤ… oล›wiadczenia decyzyjne?

Oล›wiadczenia podejmujฤ…ce decyzje to te, ktรณre bฤ™dฤ… decydowaฤ‡ o kontroli przepล‚ywu SQL oล›wiadczenia na podstawie warunkรณw. Daje programiล›cie lepszฤ… kontrolฤ™ nad zapobieganiem wykonaniu okreล›lonego kodu (schemat 1) lub wyborem ลผฤ…danego kodu w oparciu o warunek (schemat 2). Poniลผej znajduje siฤ™ graficzne przedstawienie โ€žOล›wiadczenia dotyczฤ…cego podejmowania decyzjiโ€.

Schemat oล›wiadczenia dotyczฤ…cego podejmowania decyzji
Schemat oล›wiadczenia dotyczฤ…cego podejmowania decyzji

Rodzaje oล›wiadczeล„ dotyczฤ…cych podejmowania decyzji:

Oracle zapewnia nastฤ™pujฤ…ce typy oล›wiadczeล„ wspomagajฤ…cych podejmowanie decyzji.

  • JEลšLI TO
  • JEลšLI-TO-INNY
  • JEลšLI-WTEDY-ELSIF
  • ZAgnieลผdลผone-JEลšLI
  • Sprawa
  • PRZESZUKIWANA SPRAWA

Instrukcja JEลปELI-TO

Instrukcja JEลปELI-TO jest uลผywana gล‚รณwnie do wykonania okreล›lonej sekcji kodu tylko wtedy, gdy warunek jest speล‚niony.

Warunek powinien ustฤ…piฤ‡ Boolean (Prawda/Faล‚sz). Jest to podstawowe polecenie warunkowe, ktรณre pozwoli ORACLE wykonaฤ‡/pominฤ…ฤ‡ konkretny fragment kodu na podstawie wstฤ™pnie zdefiniowanych warunkรณw.

Skล‚adnia instrukcji IF THEN:

IF <condition: returns Boolean>
THEN
 -executed only if the condition returns TRUE 
 <action_block>
END if;
  • W powyลผszej skล‚adni po sล‚owie kluczowym โ€žIFโ€ nastฤ…pi warunek, ktรณrego wynikiem bฤ™dzie โ€žPRAWDAโ€/โ€žFAลSZโ€.
  • Sterowanie wykona tylko jeล›li warunek powrรณci .
  • W przypadku warunku ocenia siฤ™ na nastฤ™pnie SQL pominie i rozpocznie wykonywanie kodu znajdujฤ…cego siฤ™ obok bloku โ€žEND IFโ€.

Uwaga: Ilekroฤ‡ warunek zostanie oceniony na โ€žNULLโ€, SQL potraktuje โ€žNULLโ€ jako โ€žFALSEโ€.

1 przykล‚ad: W tym przykล‚adzie wydrukujemy komunikat, gdy liczba bฤ™dzie wiฤ™ksza niลผ 100. W tym celu wykonamy nastฤ™pujฤ…cy kod

Aby wydrukowaฤ‡ komunikat, gdy liczba ma wartoล›ฤ‡ wiฤ™kszฤ… niลผ 100, wykonujemy nastฤ™pujฤ…cy 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;
/

Wyjaล›nienie kodu:

  • Wiersz kodu 2: Deklarowanie zmiennej โ€žaโ€ jako typu danych โ€žNUMBERโ€ i inicjowanie jej wartoล›ciฤ… โ€ž10โ€.
  • Linia kodu 4: Drukowanie instrukcji โ€žProgram uruchomionyโ€.
  • Linia kodu 5: Sprawdzanie warunku, czy zmienna โ€žaโ€ jest wiฤ™ksza niลผ โ€ž100โ€.
  • Wiersz kodu 6: Jeล›li โ€žaโ€ jest wiฤ™ksze niลผ โ€ž100โ€, wรณwczas zostanie wydrukowane โ€ža jest wiฤ™ksze niลผ 100โ€. Jeล›li โ€žaโ€ jest mniejsze lub rรณwne 100, wรณwczas warunek nie jest speล‚niony, wiฤ™c powyลผsza instrukcja drukowania jest ignorowana.
  • Linia kodu 8: Drukowanie instrukcji โ€žProgram zakoล„czonyโ€.

Dane wyjล›ciowe kodu:

Program started.
Program completed.

2 przykล‚ad: W tym przykล‚adzie wydrukujemy komunikat, jeล›li dany alfabet wystฤ™puje w angielskich samogล‚oskach (A, E, I, O, U).

Aby wyล›wietliฤ‡ komunikat, gdy podany znak jest samogล‚oskฤ…, wykonujemy nastฤ™pujฤ…cy 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;
/

Wyjaล›nienie kodu:

  • Linia kodu 2: Deklarowanie zmiennej โ€žaโ€ jako โ€žCHARโ€ o typie danych o rozmiarze โ€ž1โ€ i inicjowanie jej wartoล›ciฤ… โ€žuโ€.
  • Linia kodu 4: Sprawdzenie warunku, czy na liล›cie znajduje siฤ™ zmienna โ€žaโ€ (โ€žAโ€, โ€žEโ€, โ€žIโ€, โ€žOโ€, โ€žUโ€).
  • Wartoล›ฤ‡ โ€žaโ€ zostaล‚a przed porรณwnaniem przekonwertowana na wielkie litery, aby porรณwnanie nie uwzglฤ™dniaล‚o wielkoล›ci liter.
  • Linia kodu 5: Jeลผeli na liล›cie znajduje siฤ™ litera โ€žaโ€, zostanie wydrukowana informacja โ€žZnak wystฤ™puje w samogล‚oskach angielskichโ€. Jeล›li warunek nie zostanie speล‚niony, program nie wyล›wietli ลผadnego wyniku, poniewaลผ poza blokiem IF-THEN nie wydaliล›my ลผadnej instrukcji drukowania.

Dane wyjล›ciowe kodu:

The character is in English Vowels

Oล›wiadczenie JEลšLI-TO-INACZEJ

  • Instrukcja IF-THEN-ELSE jest uลผywana gล‚รณwnie do wyboru pomiฤ™dzy dwiema alternatywami na podstawie warunku.
  • Poniลผej znajduje siฤ™ reprezentacja skล‚adni instrukcji JEลปELI-TO-ELSE.

Skล‚adnia instrukcji 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;
  • W powyลผszej skล‚adni po sล‚owie kluczowym โ€žIFโ€ nastฤ…pi warunek, ktรณrego wynikiem bฤ™dzie โ€žPRAWDAโ€/โ€žFAลSZโ€.
  • Sterowanie wykona tylko jeล›li warunek powrรณci .
  • W przypadku warunku ma wartoล›ฤ‡ nastฤ™pnie zostanie wykonany SQL .
  • W kaลผdym przypadku zostanie wykonany jeden z dwรณch blokรณw akcji.

Uwaga: Ilekroฤ‡ warunek ma wartoล›ฤ‡ โ€žNULLโ€, SQL potraktuje โ€žNULLโ€ jako โ€žFALSEโ€.

1 przykล‚ad: W tym przykล‚adzie wydrukujemy informacjฤ™ czy podana liczba jest parzysta czy nieparzysta.

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;
/

Wyjaล›nienie kodu:

  • Wiersz kodu 2: Deklarowanie zmiennej โ€žaโ€ jako typu danych โ€žNUMBERโ€ i inicjowanie jej wartoล›ciฤ… โ€ž11โ€.
  • Linia kodu 4: Drukowanie instrukcji โ€žProgram uruchomionyโ€.
  • Linia kodu 5: Sprawdzanie warunku, czy moduล‚ zmiennej โ€žaโ€ na โ€ž2โ€ wynosi 0.
  • Linia kodu 6: Jeล›li โ€ž0โ€, zostanie wydrukowane โ€ža jest liczbฤ… parzystฤ…โ€.
  • Wiersz kodu 7: Jeล›li wartoล›ฤ‡ moduล‚u nie jest rรณwna โ€ž0โ€, warunek powraca , wiฤ™c zostanie wydrukowany komunikat โ€ža jest liczbฤ… nieparzystฤ…โ€.
  • Linia kodu 10: Drukowanie instrukcji โ€žProgram zakoล„czonyโ€

Dane wyjล›ciowe kodu:

Program started.
a is odd number
Program completed.

Oล›wiadczenie JEลšLI-WTEDY-ELSIF

  • Instrukcja IF-THEN-ELSIF jest uลผywana gล‚รณwnie wtedy, gdy naleลผy wybraฤ‡ jednฤ… alternatywฤ™ ze zbioru alternatyw, gdzie kaลผda z alternatyw ma swoje wล‚asne warunki do speล‚nienia.
  • Pierwsze warunki, ktรณre powracajฤ… zostanie wykonane, a pozostaล‚e warunki zostanฤ… pominiฤ™te.
  • Instrukcja IF-THEN-ELSIF moลผe zawieraฤ‡ blok โ€žELSEโ€. Ten blok โ€žELSEโ€ zostanie wykonany, jeล›li ลผaden z warunkรณw nie zostanie speล‚niony.

Note: Blok ELSE jest opcjonalny w tej instrukcji warunkowej. Jeลผeli nie ma bloku ELSE i ลผaden z warunkรณw nie jest speล‚niony, to kontroler pominie caล‚y blok akcji i rozpocznie wykonywanie pozostaล‚ej czฤ™ล›ci kodu.

Skล‚adnia instrukcji IF-THEN-ELSIF:

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;
  • W powyลผszej skล‚adni sterowanie wykona tylko wtedy, gdy warunek 1 powrรณci .
  • Jeล›li warunek 1 nie jest speล‚niony, sterownik sprawdzi warunek 2.
  • Kontroler wyjdzie z instrukcji IF w nastฤ™pujฤ…cych dwรณch przypadkach.
    • Gdy kontroler znalazล‚ dowolny warunek, ktรณry zwraca . W takim przypadku zostanie wykonany odpowiedni blok akcji, a kontroler opuล›ci ten blok instrukcji IF i rozpocznie wykonywanie pozostaล‚ego kodu.
    • Gdy ลผaden z warunkรณw nie zostanie speล‚niony, kontroler then wykona blok ELSE, jeล›li jest obecny, a nastฤ™pnie wyjdzie z instrukcji IF.

Uwaga: Ilekroฤ‡ warunek ma wartoล›ฤ‡ โ€žNULLโ€, SQL potraktuje โ€žNULLโ€ jako โ€žFALSEโ€.

1 przykล‚ad: Bez bloku ELSE

W tym przykล‚adzie bฤ™dziemy drukowaฤ‡ ocenฤ™ na podstawie podanych ocen bez innego warunku (ocena >= 70 Grade A, ocena >=40 i ocena<70 Grade B, ocena >=35 i ocena<40 Grade 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;
/

Wyjaล›nienie kodu:

  • Wiersz kodu 2: Deklarowanie zmiennej โ€žmarkโ€ jako typu danych โ€žNUMBERโ€ i inicjowanie jej wartoล›ciฤ… โ€ž55โ€.
  • Linia kodu 4: Drukowanie instrukcji โ€žProgram uruchomionyโ€.
  • Wiersz kodu 5: Sprawdzanie warunku 1, czy โ€žznakโ€ jest wiฤ™kszy czy rรณwny 70.
  • Wiersz kodu 7: Poniewaลผ warunek 1 nie powiรณdล‚ siฤ™, sprawdzany jest warunek 2 โ€ž70>znak>=40โ€.
  • Linia kodu 8: Zwraca warunek 2 , stฤ…d wydrukowany zostanie komunikat โ€žGrade Bโ€.
  • Linia kodu 12: Drukowanie komunikatu โ€žProgram zakoล„czonyโ€.
  • W tym przypadku warunek 3 โ€žznak < 35โ€ zostanie pominiฤ™ty, poniewaลผ kontroler znalazล‚ jeden warunek, ktรณry zwraca przed warunkiem 3.

Dane wyjล›ciowe kodu:

Program started.
Grade B
Program completed.

2 przykล‚ad: Z blokiem ELSE

W tym przykล‚adzie wydrukujemy ocenฤ™ na podstawie podanych ocen z innym warunkiem (znak >= 70 Ocena A, ocena >=40 i ocena<70 Ocena B, ocena >=35 i ocena<40 Ocena C, w przeciwnym razie โ€žBrak ocenyโ€).

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;
/

Wyjaล›nienie kodu:

  • Wiersz kodu 2: Deklarowanie zmiennej โ€žmarkโ€ jako typu danych โ€žNUMBERโ€ i inicjowanie jej wartoล›ciฤ… โ€ž25โ€.
  • Linia kodu 4: Drukowanie instrukcji โ€žProgram uruchomionyโ€.
  • Wiersz kodu 5: Sprawdzanie warunku 1, czy โ€žznakโ€ jest wiฤ™kszy czy rรณwny 70.
  • Wiersz kodu 7: Poniewaลผ warunek 1 nie powiรณdล‚ siฤ™, sprawdzany jest warunek 2 โ€ž70>znak>=40โ€.
  • Wiersz kodu 8: Poniewaลผ warunek 2 nie powiรณdล‚ siฤ™, sprawdzany jest warunek 3 โ€ž40>znak>=35โ€.
  • Linia kodu 11: Poniewaลผ wszystkie warunki nie zostaล‚y speล‚nione, sterowanie sprawdzi teraz obecnoล›ฤ‡ bloku ELSE i wydrukuje komunikat โ€žNo Gradeโ€ z bloku ELSE.
  • Linia kodu 14: Drukowanie komunikatu โ€žProgram zakoล„czonyโ€.

Dane wyjล›ciowe kodu:

Program started.
No Grade 
Program completed.

Instrukcja zagnieลผdลผona-IF

  • Instrukcja NESTED-IF zasadniczo pozwala programistom na umieszczenie jednego lub wiฤ™cej warunkรณw โ€žJEลปELIโ€ w innym warunku โ€žJEลปELIโ€ inne niลผ zwykล‚e wypowiedzi.
  • Kaลผdy warunek โ€žJEลปELIโ€ powinien mieฤ‡ oddzielnฤ… instrukcjฤ™ โ€žKONIEC JEลปELIโ€, ktรณra oznacza koniec zakresu tego konkretnego .
  • Instrukcja โ€žIFโ€ bฤ™dzie traktowaฤ‡ najbliลผszฤ… instrukcjฤ™ โ€žEND IFโ€ jako punkt koล„cowy danego warunku.
  • Graficzne przedstawienie NESTED-IF pokazano na poniลผszym schemacie.

Instrukcja zagnieลผdลผona-IF

Instrukcja zagnieลผdลผona-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

Wyjaล›nienie skล‚adni:

  • W powyลผszej skล‚adni zewnฤ™trzny IF zawiera w swoim bloku akcji jeszcze jednฤ… instrukcjฤ™ IF.
  • Warunek 1 powraca , wรณwczas kontrola bฤ™dzie wykonywana i sprawdza warunek 1.
  • Jeล›li warunek2 rรณwnieลผ zwrรณci , Nastฤ™pnie rรณwnieลผ zostanie wykonany.
  • W przypadku warunku 2 przyjmuje siฤ™ nastฤ™pnie SQL pominie .

Tutaj zobaczymy przykล‚ad zagnieลผdลผonego if โ€“

Przykล‚ad zagnieลผdลผonej instrukcji If: najwiฤ™ksza z trzech liczb

W tym przykล‚adzie wydrukujemy najwiฤ™kszฤ… z trzech liczb, uลผywajฤ…c instrukcji Nested-If. Liczby zostanฤ… przypisane w czฤ™ล›ci deklaracji, jak widaฤ‡ w poniลผszym kodzie, tj. Number= 10,15 i 20, a maksymalna liczba zostanie pobrana przy uลผyciu instrukcji nested-if.

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;
/

Wyjaล›nienie kodu:

  • Wiersz kodu 2: Deklarowanie zmiennej โ€žaโ€ jako typu danych โ€žNUMBERโ€ i inicjowanie jej wartoล›ciฤ… โ€ž10โ€.
  • Wiersz kodu 3: Deklarowanie zmiennej โ€žbโ€ jako typu danych โ€žNUMBERโ€ i inicjowanie jej wartoล›ciฤ… โ€ž15โ€.
  • Wiersz kodu 4: Deklarowanie zmiennej โ€žcโ€ jako typu danych โ€žLICZBAโ€ i inicjowanie jej wartoล›ciฤ… โ€ž20โ€.
  • Linia kodu 6: Wydrukowanie instrukcji โ€žProgram uruchomionyโ€ (linia 6).
  • Linia kodu 7: Sprawdzanie warunku 1, czy โ€žaโ€ jest wiฤ™ksze niลผ โ€žbโ€ (linia 7).
  • Wiersz kodu 10: Jeล›li โ€žaโ€ jest wiฤ™ksze niลผ โ€žbโ€, wรณwczas warunek w โ€žzagnieลผdลผonym-jeล›li 1โ€ sprawdzi, czy โ€žaโ€ jest wiฤ™ksze niลผ โ€žcโ€ (wiersz 10).
  • Linia kodu 13: Jeล›li nadal โ€žaโ€ jest wiฤ™ksze, zostanie wydrukowany komunikat โ€žA jest najwiฤ™kszeโ€ (linia 11). W przeciwnym razie, jeล›li warunek 2 nie zostanie speล‚niony, zostanie wydrukowane โ€žC jest najwiฤ™kszeโ€ (linia 13).
  • Linia kodu 18: Jeล›li warunek 1 zwrรณci wartoล›ฤ‡ false, wรณwczas warunek w โ€žzagnieลผdลผonym-jeล›li 2โ€ sprawdzi, czy โ€žbโ€ jest wiฤ™ksze niลผ โ€žcโ€ (linia 18).
  • Linia kodu 21: Jeล›li โ€žbโ€ jest wiฤ™ksze niลผ โ€žcโ€, wรณwczas wydrukowany zostanie komunikat โ€žB jest najwiฤ™kszyโ€ (linia 19), w przeciwnym razie, jeล›li warunek 2 nie zostanie speล‚niony, zostanie wydrukowany โ€žC jest najwiฤ™kszyโ€ (linia 21).
  • Linia kodu 24: Drukowanie instrukcji โ€žProgram zakoล„czonyโ€ (linia 24).

Wyjล›cie kodu:

Program started.
Checking Nested-IF 2
C is greatest
Program completed.

Podsumowanie

W tym rozdziale poznaliล›my rรณลผne stwierdzenia dotyczฤ…ce podejmowania decyzji, ich skล‚adniฤ™ i przykล‚ady. Poniลผsza tabela zawiera podsumowanie rรณลผnych instrukcji warunkowych, ktรณre omรณwiliล›my.

TYP OPIS ZASTOSOWANIE
JEลšLI TO Sprawdza warunek logiczny, jeล›li zostanie wykonany kod PRAWDA w bloku โ€žTHENโ€. Aby pominฤ…ฤ‡/wykonaฤ‡ okreล›lony kod w oparciu o warunek.
JEลšLI-TO-INNY Sprawdza warunek logiczny, czy zostanie wykonany kod PRAWDA w bloku โ€žTHENโ€, jeล›li zostanie wykonany faล‚szywy kod w bloku โ€žELSEโ€. Najbardziej odpowiedni w stanie โ€žTO-LUB-TAKโ€.
JEลšLI-WTEDY-ELSIF Sprawdza warunek logiczny w kolejnoล›ci sekwencyjnej. Wykonany zostanie pierwszy blok w sekwencji, ktรณry zwrรณci warunek TRUE. Jeล›li ลผaden z warunkรณw w sekwencji nie jest PRAWDZIWY, wykonywany jest kod z bloku โ€žELSEโ€. Zwykle wybieraล‚em spoล›rรณd wiฤ™cej niลผ dwรณch alternatyw.
ZAgnieลผdลผone-JEลšLI Zezwala na jednฤ… lub wiฤ™cej instrukcji IF-THEN lub IF-THEN-ELSIF wewnฤ…trz innych instrukcji IF-THEN lub IF-THEN-ELSIF. Uลผywane gล‚รณwnie w sytuacji zagnieลผdลผonej.

Podsumuj ten post nastฤ™pujฤ…co: