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

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


