Oracle Příkaz PL/SQL IF THEN ELSE: ELSIF, NESTED-IF
Co jsou prohlášení o rozhodování?
Rozhodovací prohlášení jsou ti, kteří budou rozhodovat o řízení toku SQL prohlášení na základě podmínek. Poskytuje programátorovi lepší kontrolu při zabránění spuštění konkrétního kódu (schéma 1) nebo výběru požadovaného kódu na základě podmínky (schéma 2). Níže je vyobrazeno „Prohlášení o rozhodování“.
Typy rozhodovacích prohlášení:
Oracle poskytuje následující typy rozhodovacích prohlášení.
- KDYŽ POTOM
- JESTLIŽE PAK JINAK
- IF-THEN-ELSIF
- NESTED-IF
- CASE
- VYHLEDÁVANÝ PŘÍPAD
Prohlášení IF-THEN
Příkaz IF-THEN se používá hlavně k provedení určité části kódů, pouze pokud je splněna podmínka.
Podmínka by měla vyhovovat Boolean (Pravda/Nepravda). Je to základní podmíněný příkaz, který umožní serveru ORACLE spustit/přeskočit konkrétní část kódu na základě předem definovaných podmínek.
Syntaxe příkazů IF THEN:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_block> END if;
- Ve výše uvedené syntaxi bude klíčové slovo 'IF' následovat podmínkou, která se vyhodnotí jako 'TRUE'/'FALSE'.
- Ovládací prvek provede pouze pokud se stav vrátí .
- V případě stavu vyhodnocuje k pak SQL přeskočí a začne provádět kód vedle bloku 'END IF'.
Poznámka: Kdykoli je podmínka vyhodnocena jako 'NULL', bude SQL považovat 'NULL' za 'FALSE'.
Příklad 1: V tomto příkladu vytiskneme zprávu, když je číslo větší než 100. Za tímto účelem spustíme následující kód
Chcete-li vytisknout zprávu, když má číslo hodnotu vyšší než 100, provedeme následující kód.
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; /
Vysvětlení kódu:
- Řádek kódu 2: Deklarace proměnné 'a' jako datového typu 'NUMBER' a její inicializace hodnotou '10'.
- Řádek kódu 4: Tisk výpisu „Program spuštěn“.
- Řádek kódu 5: Kontrola podmínky, zda proměnná 'a' je větší než '100.'
- Řádek kódu 6: Pokud je „a“ větší než „100“, vytiskne se „a je větší než 100“. Pokud je 'a' menší nebo rovno 100, pak podmínka selže, takže výše uvedený tiskový příkaz bude ignorován.
- Řádek kódu 8: Tisk výpisu „Program dokončen“.
Výstup kódu:
Program started. Program completed.
Příklad 2: V tomto příkladu vytiskneme zprávu, pokud je daná abeceda přítomna v anglických samohláskách (A, E, I, O, U).
Chcete-li vytisknout zprávu, když je daný znak Samohláska, spustíme následující kód.
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; /
Vysvětlení kódu:
- Řádek kódu 2: Deklarace proměnné 'a' jako 'CHAR' datového typu velikosti '1' a její inicializace s hodnotou 'u'.
- Řádek kódu 4: Kontrola podmínky, zda je v seznamu přítomna proměnná 'a' ('A','E','I','O','U').
- Hodnota 'a' byla před porovnáním převedena na velká písmena, aby se při porovnání nerozlišovala malá a velká písmena.
- Řádek kódu 5: Pokud je v seznamu přítomno 'a', vytiskne se prohlášení „Znak je v anglických samohláskách“. Pokud podmínka selhala, pak tento program nevydá žádný výstup, protože mimo blok IF-THEN jsme nevydali žádné tiskové prohlášení.
Výstup kódu:
The character is in English Vowels
Prohlášení IF-THEN-ELSE
- Příkaz IF-THEN-ELSE se používá hlavně k výběru mezi dvěma alternativami na základě podmínky.
- Níže je znázornění syntaxe příkazu IF-THEN-ELSE.
Syntaxe příkazů 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;
- Ve výše uvedené syntaxi bude klíčové slovo 'IF' následovat podmínkou, která se vyhodnotí jako 'TRUE'/'FALSE'.
- Ovládací prvek provede pouze pokud se stav vrátí .
- V případě stavu se hodnotí k pak se SQL spustí .
- V každém případě bude proveden jeden ze dvou akčních bloků.
Poznámka: Kdykoli se podmínka vyhodnotí jako 'NULL', bude SQL považovat 'NULL' za 'FALSE'.
Příklad 1: V tomto příkladu vytiskneme zprávu, zda je dané číslo liché nebo sudé.
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; /
Vysvětlení kódu:
- Řádek kódu 2: Deklarace proměnné 'a' jako datového typu 'NUMBER' a její inicializace hodnotou '11'.
- Řádek kódu 4: Tisk výpisu „Program spuštěn“.
- Řádek kódu 5: Kontrola podmínky, zda modul proměnné 'a' krát '2' je 0.
- Řádek kódu 6: Pokud je '0', vytiskne se „a je sudé číslo“.
- Řádek kódu 7: Pokud hodnota modulu není rovna '0', pak se podmínka vrátí , takže se vytiskne zpráva „a je liché číslo“.
- Řádek kódu 10: Tisk prohlášení „Program dokončen“
Výstup kódu:
Program started. a is odd number Program completed.
Prohlášení IF-THEN-ELSIF
- Příkaz IF-THEN-ELSIF se používá hlavně tam, kde by měla být vybrána jedna alternativa ze sady alternativ, kde každá alternativa má své vlastní podmínky, které musí být splněny.
- První podmínky, které se vracejí se provede a zbývající podmínky budou přeskočeny.
- Příkaz IF-THEN-ELSIF může obsahovat blok 'ELSE'. Tento blok 'ELSE' bude proveden, pokud nebude splněna žádná z podmínek.
Pozor: Blok ELSE je v tomto podmíněném příkazu volitelný. Pokud neexistuje žádný blok ELSE a žádná z podmínek není splněna, pak ovladač přeskočí celý akční blok a začne provádět zbývající část kódu.
Syntaxe příkazů 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;
- Ve výše uvedené syntaxi ovládací prvek provede pouze pokud se vrátí podmínka1 .
- Pokud podmínka 1 není splněna, regulátor zkontroluje podmínku 2.
- Regulátor opustí příkaz IF v následujících dvou případech.
- Když kontrolér nalezl jakýkoli stav, který se vrací . V tomto případě bude proveden odpovídající action_block a kontrolér opustí tento blok příkazů IF a začne provádět zbývající kód.
- Pokud není splněna žádná z podmínek, pak regulátor provede ELSE blok, pokud je přítomen, a poté opustí příkaz IF.
Poznámka: Kdykoli se podmínka vyhodnotí jako 'NULL', bude SQL považovat 'NULL' za 'FALSE'.
Příklad 1: Bez bloku ELSE
V tomto příkladu vytiskneme známku na základě zadaných známek bez podmínky další (známka >= 70 Známka A, známka >=40 a známka<70 Známka B, známka >=35 a známka<40 Známka 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; /
Vysvětlení kódu:
- Řádek kódu 2: Deklarace proměnné 'mark' jako datového typu 'NUMBER' a její inicializace hodnotou '55'.
- Řádek kódu 4: Tisk výpisu „Program spuštěn“.
- Řádek kódu 5: Kontrola podmínky 1, zda je 'mark' větší nebo rovno 70.
- Řádek kódu 7: Protože podmínka1 selhala, zkontroluje se podmínka2 '70>mark>=40′.
- Řádek kódu 8: Vrací se podmínka2 , proto se vytiskne zpráva 'Stupeň B'.
- Řádek kódu 12: Tisk výpisu „Program dokončen“.
- V tomto případě bude podmínka 3 „značka < 35“ přeskočena, protože ovladač našel jednu podmínku, která vrátí před podmínkou 3.
Výstup kódu:
Program started. Grade B Program completed.
Příklad 2: S blokem ELSE
V tomto příkladu vytiskneme známku na základě daných známek s podmínkou else (známka >= 70 Známka A, známka >=40 a známka<70 Známka B, známka >=35 a známka<40 Známka C, jinak „Žádná známka“).
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; /
Vysvětlení kódu:
- Řádek kódu 2: Deklarace proměnné 'mark' jako datového typu 'NUMBER' a její inicializace hodnotou '25'.
- Řádek kódu 4: Tisk výpisu „Program spuštěn“.
- Řádek kódu 5: Kontrola podmínky 1, zda je „značka“ větší nebo rovna 70.
- Řádek kódu 7: Protože podmínka1 selhala, zkontroluje se podmínka2 '70>mark>=40′.
- Řádek kódu 8: Protože podmínka2 selhala, zkontroluje se podmínka3 '40>mark>=35′.
- Řádek kódu 11: Protože všechny podmínky selhaly, kontrola nyní zkontroluje přítomnost ELSE bloku a vytiskne zprávu 'No Grade' z ELSE bloku.
- Řádek kódu 14: Tisk výpisu „Program dokončen“.
Výstup kódu:
Program started. No Grade Program completed.
Prohlášení NESTED-IF
- Příkaz NESTED-IF v zásadě umožňuje programátorům umístit jednu nebo více podmínek „IF“ do jiné podmínky „IF“ jiná než běžná prohlášení.
- Každá podmínka „IF“ by měla mít samostatný příkaz „END IF“, který označuje konec rozsahu dané konkrétní .
- Příkaz 'IF' bude považovat nejbližší příkaz 'END IF' za koncový bod pro tento konkrétní stav.
- Obrazové znázornění pro NESTED-IF je znázorněno na obrázku níže.
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
Vysvětlení syntaxe:
- Ve výše uvedené syntaxi obsahuje vnější IF ve svém akčním bloku ještě jeden příkaz IF.
- Vrací se podmínka1 , pak se provede kontrola a kontroluje stav1.
- Pokud se také vrátí podmínka2 , pak bude také provedena.
- V případě podmínky 2 se vyhodnotí na pak SQL přeskočí .
Zde uvidíme příklad Nested If –
Příklad příkazu Nested-If: Největší ze tří čísel
V tomto příkladu vytiskneme největší ze tří čísel pomocí příkazu Nested-If. Čísla budou přiřazena v části deklarace, jak můžete vidět v kódu níže, tj. Number= 10,15 a 20 a maximální počet bude načten pomocí příkazů 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; /
Vysvětlení kódu:
- Řádek kódu 2: Deklarace proměnné 'a' jako datového typu 'NUMBER' a její inicializace hodnotou '10'.
- Řádek kódu 3: Deklarace proměnné 'b' jako datového typu 'NUMBER' a její inicializace hodnotou '15'.
- Řádek kódu 4: Deklarace proměnné 'c' jako datového typu 'NUMBER' a její inicializace hodnotou '20'.
- Řádek kódu 6: Tisk příkazu „Program spuštěn“ (řádek 6).
- Řádek kódu 7: Kontrola podmínky1, zda 'a' je větší než 'b' (řádek 7).
- Řádek 10: Pokud je 'a' větší než 'b, pak podmínka v 'vnořený-if 1' zkontroluje, zda je 'a' větší než 'c' (řádek 10).
- Řádek kódu 13: Pokud je stále 'a' větší, vytiskne se zpráva 'A je největší' (řádek 11). V opačném případě, pokud podmínka 2 selže, bude vytištěno 'C je největší' (řádek 13).
- Řádek kódu 18: V případě, že podmínka1 vrátí hodnotu false, podmínka v 'vnořený-if 2' zkontroluje, zda je 'b' větší než 'c' (řádek 18).
- Řádek kódu 21: Pokud je 'b' větší než 'c' , vytiskne se zpráva 'B je největší' (řádek 19), jinak pokud selže podmínka 2, vytiskne se 'C je největší' (řádek 21).
- Řádek kódu 24: Tisk prohlášení „Program dokončen“ (řádek 24).
Výstup kódu:
Program started. Checking Nested-IF 2 C is greatest Program completed.
Shrnutí
V této kapitole jsme se naučili různé rozhodovací příkazy a jejich syntaxi a příklady. Níže uvedená tabulka uvádí souhrn různých podmíněných příkazů, o kterých jsme diskutovali.
TYP | POPIS | POUŽITÍ |
---|---|---|
KDYŽ POTOM | Zkontroluje booleovskou podmínku, pokud bude proveden TRUE kód v bloku 'THEN'. | Chcete-li přeskočit,/spustit konkrétní kód na základě podmínky. |
JESTLIŽE PAK JINAK | Kontroluje booleovskou podmínku, pokud bude proveden TRUE kód v bloku 'THEN', pokud se provede falešný kód v bloku 'ELSE'. | Nejvhodnější ve stavu 'THIS-OR-THAT'. |
IF-THEN-ELSIF | Kontroluje booleovskou podmínku v sekvenčním pořadí. Bude proveden první blok v sekvenci, který vrátí podmínku TRUE. Pokud není žádná z podmínek v sekvenci PRAVDA, provede se kód v bloku 'ELSE'. | Většinou se používá k výběru z více než dvou alternativ. |
NESTED-IF | Umožňuje jeden nebo více příkazů IF-THEN nebo IF-THEN-ELSIF uvnitř jiného příkazu IF-THEN nebo IF-THEN-ELSIF. | Používá se hlavně v situaci vnořených podmínek. |