Oracle PL/SQL IF THEN ANDRE Uttalande: ELSIF, NESTED-IF
⚡ Smart sammanfattning
PL/SQL-beslutsfattandesatser styr vilken kod som körs baserat på ett booleskt villkor. Oracle tillhandahåller IF-THEN, IF-THEN-ELSE, IF-THEN-ELSIF och NESTED-IF, så ett program kan hoppa över ett block, välja mellan två sökvägar eller välja ett alternativ från många.

Vad är beslutsfattande uttalanden?
Beslutsfattande uttalanden avgör flödeskontrollen av SQL Uttryck baserade på villkor. De ger programmeraren bättre kontroll över att förhindra att ett visst block körs, eller att välja ett önskat block baserat på ett villkor. Nedan visas en bildrepresentation av beslutsfattandeuttrycket.

Typer av beslutsfattande uttalanden: Oracle tillhandahåller följande typer.
- OM DÅ
- OM DÅ ANNARS
- OM-DÅ-ELSIF
- NESTAD-OM
- CASE
- SÖKT FALL
Den här handledningen behandlar IF-varianterna. CASE- och sökta CASE-formulär behandlas i PL/SQL CASE-sats guide.
OM-DÅ-uttalande
IF-THEN-satsen används för att köra en viss del av koden endast när ett villkor är uppfyllt. Villkoret ska ge en Boolean (Sant/Falskt) värde. Det är en grundläggande villkorlig sats som låter Oracle köra eller hoppa över en kodstycke baserat på det fördefinierade villkoret.
Syntax för IF-THEN-satser:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_block> END IF;
- I syntaxen ovan följs nyckelordet 'OM' av ett villkor som utvärderas till 'SANT' eller 'FALSKT'.
- Kontrollen utför endast om tillståndet återkommer .
- Om villkoret utvärderas till , SQL hoppar över och börjar exekvera koden efter blocket 'END IF'.
Obs: När ett villkor utvärderas till 'NULL' behandlar SQL 'NULL' som 'FALSKT'.
Exempel 1: I det här exemplet skriver vi ut ett meddelande när talet är större än 100.
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; /
Code Förklaring:
- Code rad 2: Deklarerar variabeln 'a' som datatypen 'NUMBER' och initierar den med värdet '10'.
- Code rad 4: Skriver ut meddelandet ”Programmet startade”.
- Code rad 5: Kontrollerar villkoret om variabeln 'a' är större än '100'.
- Code rad 6: Om 'a' är större än '100', skrivs "a är större än 100" ut. Om 'a' är mindre än eller lika med 100, misslyckas villkoret och utskriftssatsen ignoreras.
- Code rad 8: Skriver ut meddelandet ”Program slutfört”.
Code Produktion:
Program started. Program completed.
Exempel 2: I det här exemplet skriver vi ut ett meddelande om en given bokstav är en engelsk vokal (A, E, I, O, U).
DECLARE a CHAR(1) := 'u'; BEGIN IF UPPER(a) in ('A','E','I','O','U' ) THEN dbms_output.put_line('The character is in English Vowels'); END IF; END; /
Code Förklaring:
- Code rad 2: Deklarera variabeln 'a' som 'CHAR' av storlek '1' och initiera den med värdet 'u'.
- Code rad 4: Kontrollerar om variabeln 'a' finns i listan ('A', 'E', 'I', 'O', 'U'). Värdet på 'a' konverteras till versaler före jämförelse, för att göra jämförelsen skiftläges-okänslig.
- Code rad 5: Om 'a' finns i listan skrivs "Tecknet är i engelska vokaler" ut. Om villkoret misslyckas ger programmet ingen utdata, eftersom det inte finns någon utskriftssats utanför IF-THEN-blocket.
Code Produktion:
The character is in English Vowels
OM-DÅ-ANNARS uttalande
IF-THEN-ELSE-satsen används för att välja mellan två alternativ baserat på ett villkor. Nedan följer syntaxen.
Syntax för IF-THEN-ELSE-satser:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_block1> ELSE -execute if the condition failed (returns FALSE) <action_block2> END IF;
- Nyckelordet 'OM' följs av ett villkor som utvärderas till 'SANT' eller 'FALSKT'.
- Kontrollen körs endast om tillståndet återkommer .
- Om villkoret utvärderas till , SQL körs .
- I vilket fall som helst exekveras ett av de två åtgärdsblocken.
Obs: När ett villkor utvärderas till 'NULL' behandlar SQL 'NULL' som 'FALSKT'.
Exempel 1: I det här exemplet skriver vi ut om det givna talet är udda eller jämnt.
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 number'); END IF; dbms_output.put_line ('Program completed.'); END; /
Code Förklaring:
- Code rad 2: Deklarerar variabeln 'a' som datatypen 'NUMBER' och initierar den med värdet '11'.
- Code rad 4: Skriver ut meddelandet ”Programmet startade”.
- Code rad 5: Kontroll av om modulen för variabeln 'a' med '2' är 0.
- Code rad 6: Om '0', skrivs "a är ett jämnt tal" ut.
- Code rad 7: Om modulvärdet inte är lika med '0' returnerar villkoret , så ”a är ett udda tal” skrivs ut.
- Code rad 10: Skriver ut meddelandet ”Program slutfört”.
Code Produktion:
Program started. a is odd number Program completed.
OM-DÅ-ELSIF-uttalande
- IF-THEN-ELSIF-satsen används där ett alternativ ska väljas från en uppsättning alternativ, där varje alternativ har sitt eget villkor.
- Det första villkoret som återkommer körs och de återstående villkoren hoppas över.
- IF-THEN-ELSIF-satsen kan innehålla ett 'ELSE'-block, som körs om inget av villkoren är uppfyllt.
Obs: ELSE-blocket är valfritt. Om det inte finns något ELSE-block och inget av villkoren är uppfyllda, hoppar kontrollenheten över alla actionblock och exekverar den återstående koden.
Syntax för IF-THEN-ELSIF-satser:
IF <condition1: returns Boolean> THEN -executed only if the condition returns TRUE <action_block1> ELSIF <condition2: returns Boolean> THEN <action_block2> ELSIF <condition3: returns Boolean> THEN <action_block3> ELSE --optional <action_block_else> END IF;
- Kontrollen körs endast om villkor1 returnerar .
- Om villkor 1 inte är uppfyllt kontrollerar styrenheten villkor 2, och så vidare.
- Kontrollern avslutar IF-satsen när den hittar ett villkor som returnerar och kör det matchande åtgärdsblocket, eller när inget är uppfyllt och ELSE-blocket (om det finns) körs.
Obs: När ett villkor utvärderas till 'NULL' behandlar SQL 'NULL' som 'FALSKT'.
Exempel 1: Utan ett ELSE-block. I det här exemplet skriver vi ut betyget baserat på de givna poängen utan ett annat villkor (poäng >= 70 Betyg A, poäng >= 40 och poäng < 70 Betyg B, poäng >= 35 och poäng < 40 Betyg 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; /
Code Förklaring:
- Code rad 2: Deklarerar variabeln 'mark' som datatypen 'NUMBER' och initierar den med värdet '55'.
- Code rad 4: Skriver ut meddelandet ”Programmet startade”.
- Code rad 5: Kontrollerar villkor 1, om 'mark' är större än eller lika med 70.
- Code rad 7: Eftersom villkor1 misslyckades, kontrolleras villkor2 '70 > mark >= 40′.
- Code rad 8: Villkor2 returnerar , så meddelandet 'Betyg B' skrivs ut.
- Code rad 12: Skriver ut påståendet ”Program slutfört”. Villkor 3 'poäng < 35' hoppas över, eftersom ett SANT-villkor redan hittades.
Code Produktion:
Program started. Grade B Program completed.
Exempel 2: Med ett ELSE-block. I det här exemplet skriver vi ut betyget baserat på de givna poängen med ett annat villkor (poäng >= 70 Betyg A, poäng >= 40 och poäng < 70 Betyg B, poäng >= 35 och poäng < 40 Betyg C, annars 'Inget betyg').
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; /
Code Förklaring:
- Code rad 2: Deklarerar variabeln 'mark' som datatypen 'NUMBER' och initierar den med värdet '25'.
- Code rad 4: Skriver ut meddelandet ”Programmet startade”.
- Code rad 5: Kontrollerar villkor 1, om 'mark' är större än eller lika med 70.
- Code rad 7: Eftersom villkor1 misslyckades, kontrolleras villkor2 '70 > mark >= 40′.
- Code rad 9: Eftersom villkor2 misslyckades, kontrolleras villkor3 '40 > mark >= 35′.
- Code rad 11: Eftersom alla villkor misslyckades, kontrollerar kontrollen ELSE-blocket och skriver ut 'Inget betyg'.
- Code rad 14: Skriver ut meddelandet ”Program slutfört”.
Code Produktion:
Program started. No Grade Program completed.
NESTED-IF-uttalande
- NESTED-IF-satsen låter programmerare placera ett eller flera 'IF'-villkor inuti ett annat 'IF'-villkor. .
- Varje 'OM'-villkor ska ha en separat 'END IF'-sats, som markerar slutet på omfattningen för det specifika villkoret .
- 'IF'-satsen betraktar närmaste 'END IF' som slutpunkt för det villkoret.
- Den bildliga representationen för NESTED-IF visas nedan.
IF <condition1: 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_block1 ends> END IF; --END IF corresponds to condition1
Syntaxförklaring:
- Det yttre IF-värdet innehåller ytterligare ett IF-uttryck i sitt åtgärdsblock.
- Om villkor1 returnerar , kontrollen körs och kontrollerar skick2.
- Om villkor2 också returnerar , sedan är också avrättad.
- Om villkor2 utvärderas till , SQL hoppar över .
Exempel på nästlad OM-sats: Störst av tre tal. I det här exemplet skriver vi ut det största av tre tal med hjälp av en nästlad om-sats. Talen tilldelas i deklarationsdelen (Number = 10, 15 och 20), och det största talet hämtas med hjälp av nästlade om-satser.
DECLARE a NUMBER := 10; b NUMBER := 15; c NUMBER := 20; BEGIN dbms_output.put_line('Program started.'); IF( a > b)THEN /*Nested-if 1 */ 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; /
Code Förklaring:
- Code rad 2-4: Deklarerar variablerna 'a', 'b' och 'c' som 'NUMBER' och initierar dem med 10, 15 och 20.
- Code rad 6: Skriver ut meddelandet ”Programmet startade”.
- Code rad 7: Kontrollerar villkor 1, om 'a' är större än 'b'.
- Code rad 10: Om 'a' är större än 'b' kontrollerar den nästlade om-funktionen 1 om 'a' är större än 'c'.
- Code rad 11-13: Om 'a' fortfarande är större, skrivs 'A är störst'; annars skrivs 'C är störst'.
- Code rad 18: Om villkor1 returnerar falskt, kontrollerar nested-if 2 om 'b' är större än 'c'.
- Code rad 19-21: Om 'b' är större än 'c' skrivs 'B är störst'; annars skrivs 'C är störst'.
- Code rad 24: Skriver ut meddelandet ”Program slutfört”.
Utmatning av kod:
Program started. Checking Nested-IF 2 C is greatest Program completed.
Jämförelse av beslutsfattande uttalanden
Tabellen nedan sammanfattar de olika villkorssatser som diskuteras, så att den rätta kan väljas för en given situation.
| Typ | BESKRIVNING | Användning |
|---|---|---|
| OM DÅ | Kontrollerar ett booleskt villkor; om det är SANT körs koden i blocket 'THEN'. | Att hoppa över eller exekvera ett visst block baserat på villkoret. |
| OM DÅ ANNARS | Kontrollerar ett booleskt villkor; om SANT körs 'THEN'-blocket, om FALSKT körs 'ELSE'-blocket. | Mest lämpligt i ett "det här eller det där"-läge. |
| OM-DÅ-ELSIF | Kontrollerar villkor i sekvens. Det första blocket som returnerar TRUE körs. Om inget av dem är TRUE körs 'ELSE'-blocket. | Används för att välja mellan fler än två alternativ. |
| NESTAD-OM | Tillåter en eller flera IF-THEN- eller IF-THEN-ELSIF-satser inuti en annan. | Används huvudsakligen i en kapslad situation. |


