Oracle PL/SQL IF THEN ELSE utasítás: ELSIF, NESTED-IF

⚡ Okos összefoglaló

A PL/SQL döntéshozatali utasítások szabályozzák, hogy melyik kód fut egy logikai feltétel alapján. Oracle Az IF-THEN, IF-THEN-ELSE, IF-THEN-ELSHA és NESTED-IF függvényeket biztosítja, így egy program kihagyhat egy blokkot, választhat két útvonal közül, vagy választhat egyet a sok alternatíva közül.

  • 🔀 Cél: Az IGAZ vagy HAMIS értéket visszaadó feltétel határozza meg a végrehajtás menetét.
  • HA-AKKOR: Csak akkor futtat le egy blokkot, ha a feltétel IGAZ, egyébként kihagyja.
  • ↔️ HA-AKKOR-KÜLÖNBEN: Két blokk közül választhat, az egyik az IGAZ, a másik a HAMIS értéket jelenti.
  • 🪜 HA-AKKOR-ELSZIF: A feltételeket sorban teszteli, és lefuttatja az első IGAZ értéket állító függvényt, opcionális ELSE függvény hozzáadásával.
  • 🧩 BEGYASZTOTT HA: Egy IF-et egy másik IF-be helyez kombinált feltételek esetén.
  • ⚠️ NULL szabály: A NULL értéket adó feltételt HAMISNAK tekinti a rendszer.
  • 🔚 Végrehajtó: Minden IF-et egy megfelelő END IF-fel kell lezárni.

Oracle PL/SQL HA AKKOR KÜLÖNBEN ELSZ HA

Mik azok a döntéshozatali nyilatkozatok?

A döntéshozatali utasítások határozzák meg az áramlásvezérlést SQL feltételeken alapuló utasítások. Ezek jobb kontrollt biztosítanak a programozónak egy adott blokk végrehajtásának megakadályozása, vagy egy kívánt blokk feltételen alapuló kiválasztása felett. Az alábbiakban a döntéshozatali utasítás képi ábrázolása látható.

Döntéshozatali nyilatkozat diagram
Döntéshozatali nyilatkozat diagram

Döntéshozatali nyilatkozatok típusai: Oracle a következő típusokat kínálja.

  • HA AKKOR
  • HA-AKKOR-MÁS
  • HA-AKKOR-ELSIF
  • FÉSZESÍTETT-HA
  • Esetek
  • KERESÉS ESET

Ez az oktatóanyag az IF variánsokat tárgyalja. A CASE és a keresett CASE űrlapokat a következő részben tárgyaljuk. PL/SQL CASE utasítás útmutató.

HA-THEN nyilatkozat

Az IF-THEN utasítást arra használjuk, hogy egy adott kódrészletet csak akkor hajtsunk végre, ha egy feltétel teljesül. A feltételnek egy eredményt kell eredményeznie. logikai (Igaz/Hamis) érték. Ez egy alapvető feltételes utasítás, amely lehetővé teszi Oracle egy kódrészletet végrehajtani vagy kihagyni az előre meghatározott feltétel alapján.

HA-AKKOR utasítások szintaxisa:

IF <condition: returns Boolean>
THEN
-executed only if the condition returns TRUE
<action_block>
END IF;
  • A fenti szintaxisban az „HA” kulcsszót egy feltétel követi, amely „IGAZ” vagy „HAMIS” értéket ad ki.
  • A vezérlés végrehajtja a csak akkor, ha az állapot visszatér .
  • Ha a feltétel kiértékelése a következőre történik: , az SQL kihagyja a és az 'END IF' blokk után elkezdi végrehajtani a kódot.

Jegyzet: Amikor egy feltétel értéke 'NULL', az SQL a 'NULL' értéket 'FALSE'-ként kezeli.

Példa 1: Ebben a példában egy üzenetet nyomtatunk ki, ha a szám nagyobb, mint 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 Magyarázat:

  • Code 2. sor: Az 'a' változó deklarálása 'NUMBER' adattípusként és inicializálása '10' értékkel.
  • Code 4. sor: A „Program elindult” utasítás kinyomtatása.
  • Code 5. sor: Annak a feltételnek az ellenőrzése, hogy az 'a' változó nagyobb-e, mint '100'.
  • Code 6. sor: Ha az 'a' nagyobb, mint '100', akkor az „a nagyobb, mint 100” szöveg jelenik meg. Ha az 'a' kisebb vagy egyenlő, mint 100, a feltétel sikertelen, és a nyomtatási utasítás figyelmen kívül marad.
  • Code 8. sor: A „Program befejeződött” utasítás kinyomtatása.

Code output:

Program started.
Program completed.

Példa 2: Ebben a példában egy üzenetet nyomtatunk ki, ha egy adott betű angol magánhangzó (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 Magyarázat:

  • Code 2. sor: Az 'a' változó deklarálása '1' méretű 'CHAR' változóként, és inicializálása 'u' értékkel.
  • Code 4. sor: Annak ellenőrzése, hogy az 'a' változó szerepel-e a listában ('A', 'E', 'I', 'O', 'U'). Az 'a' értékét nagybetűsre konvertálja az összehasonlítás előtt, hogy az összehasonlítás során ne legyen megkülönböztethető a kis- és nagybetűk.
  • Code 5. sor: Ha az 'a' karakter szerepel a listában, akkor a „A karakter angol magánhangzókban van” szöveg kerül kiírásra. Ha a feltétel nem teljesül, a program nem ad kimenetet, mivel az IF-THEN blokkon kívül nincs kiíró utasítás.

Code output:

The character is in English Vowels

HA-AKKOR-MÁS nyilatkozat

Az IF-THEN-ELSE utasítás két alternatíva közötti választásra szolgál egy feltétel alapján. Az alábbiakban a szintaxist láthatjuk.

Az IF-THEN-ELSE utasítások szintaxisa:

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;
  • Az „HA” kulcsszót egy feltétel követi, amely „IGAZ” vagy „HAMIS” értéket ad ki.
  • A vezérlés végrehajtódik csak akkor, ha az állapot visszatér .
  • Ha a feltétel kiértékelése a következőre történik: , az SQL végrehajtja .
  • Mindenesetre a két műveleti blokk egyike végrehajtódik.

Jegyzet: Amikor egy feltétel értéke 'NULL', az SQL a 'NULL' értéket 'FALSE'-ként kezeli.

Példa 1: Ebben a példában kiírjuk, hogy a megadott szám páros vagy páratlan.

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 Magyarázat:

  • Code 2. sor: Az 'a' változó deklarálása 'NUMBER' adattípusként és inicializálása '11' értékkel.
  • Code 4. sor: A „Program elindult” utasítás kinyomtatása.
  • Code 5. sor: Annak ellenőrzése, hogy az 'a' változó '2'-vel vett modulusa 0-e.
  • Code 6. sor: Ha '0', akkor az „a páros szám” szöveg jelenik meg.
  • Code 7. sor: Ha a modulus értéke nem egyenlő '0'-val, a feltétel visszaadja a , tehát az „a páratlan szám” szöveg jelenik meg.
  • Code 10. sor: A „Program befejeződött” utasítás kinyomtatása.

Code output:

Program started.
a is odd number
Program completed.

IF-THEN-ELSIF nyilatkozat

  • Az IF-THEN-ELSIF utasítást akkor használjuk, ha egy alternatívát kell választani egy alternatívák halmazából, ahol minden alternatívának megvan a saját feltétele.
  • Az első visszatérő feltétel végrehajtásra kerül, a fennmaradó feltételeket pedig kihagyja.
  • Az IF-THEN-ELSIF utasítás tartalmazhat egy 'ELSE' blokkot, amely akkor hajtódik végre, ha egyik feltétel sem teljesül.

Jegyzet: Az ELSE blokk opcionális. Ha nincs ELSE blokk, és egyik feltétel sem teljesül, a vezérlő kihagyja az összes műveleti blokkot, és a fennmaradó kódot hajtja végre.

Az IF-THEN-ELSIF utasítások szintaxisa:

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;
  • A vezérlés végrehajtódik csak akkor, ha az 1. feltétel visszaadja .
  • Ha az első feltétel nem teljesül, a vezérlő ellenőrzi a második feltételt, és így tovább.
  • A vezérlő kilép az IF utasításból, amikor olyan feltételt talál, amely visszaadja a és lefuttatja a megfelelő műveleti blokkot, vagy ha egyik sem teljesül, és lefuttatja az ELSE blokkot (ha van ilyen).

Jegyzet: Amikor egy feltétel értéke 'NULL', az SQL a 'NULL' értéket 'FALSE'-ként kezeli.

1. példa: ELSE blokk nélkül. Ebben a példában a megadott jegyek alapján nyomtatjuk ki az érdemjegyet, else feltétel nélkül (jegy >= 70 A jegy, jegy >= 40 és jegy < 70 B jegy, jegy >= 35 és jegy < 40 C jegy).

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 Magyarázat:

  • Code 2. sor: A 'mark' változó deklarálása 'NUMBER' adattípusként és inicializálása '55' értékkel.
  • Code 4. sor: A „Program elindult” utasítás kinyomtatása.
  • Code 5. sor: Az 1. feltétel ellenőrzése, hogy a 'jel' értéke nagyobb vagy egyenlő-e 70-nel.
  • Code 7. sor: Mivel az 1. feltétel nem teljesült, a 2. feltételt a '70 > mark >= 40′ jelöli a rendszer.
  • Code 8. sor: A Condition2 értéket adja vissza , így a „B osztály” üzenet kerül kinyomtatásra.
  • Code 12. sor: A „Program befejeződött” utasítás kinyomtatása. A 3. feltételt, a „jegy < 35”-öt kihagyjuk, mivel már található egy IGAZ feltétel.

Code output:

Program started.
Grade B
Program completed.

2. példa: ELSE blokkal. Ebben a példában a megadott jegyek alapján nyomtatjuk ki az érdemjegyet egy else feltétellel (érdemjegy >= 70 A érdemjegy, érdemjegy >= 40 és érdemjegy < 70 B érdemjegy, érdemjegy >= 35 és érdemjegy < 40 C érdemjegy, egyébként 'Nincs érdemjegy').

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 Magyarázat:

  • Code 2. sor: A 'mark' változó deklarálása 'NUMBER' adattípusként és inicializálása '25' értékkel.
  • Code 4. sor: A „Program elindult” utasítás kinyomtatása.
  • Code 5. sor: Az 1. feltétel ellenőrzése, hogy a 'jel' értéke nagyobb vagy egyenlő-e 70-nel.
  • Code 7. sor: Mivel az 1. feltétel nem teljesült, a 2. feltételt a '70 > mark >= 40′ jelöli a rendszer.
  • Code 9. sor: Mivel az 2. feltétel nem teljesült, a 3. feltételt a '40 > mark >= 35′ jelöli a rendszer.
  • Code 11. sor: Mivel minden feltétel sikertelen volt, a vezérlő ellenőrzi az ELSE blokkot, és „Nincs osztályzat” eredményt nyomtat.
  • Code 14. sor: A „Program befejeződött” utasítás kinyomtatása.

Code output:

Program started.
No Grade
Program completed.

NESTED-IF nyilatkozat

  • A NESTED-IF utasítás lehetővé teszi a programozók számára, hogy egy vagy több 'HA' feltételt egy másik 'HA' feltételen belül helyezzenek el. .
  • Minden „HA” feltételhez külön „END HA” utasításnak kell tartoznia, amely az adott feltétel hatókörének végét jelzi. .
  • Az „IF” utasítás a legközelebbi „END IF”-et tekinti az adott feltétel végpontjának.
  • A NESTED-IF képi ábrázolása alább látható.

Beágyazott IF utasításfolyamat

Beágyazott IF utasításstruktúra

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

Szintaxis magyarázata:

  • A külső IF ​​műveleti blokkja még egy IF utasítást tartalmaz.
  • Ha az 1. feltétel visszatér , a vezérlés végrehajtódik és ellenőrzi a feltételt2.
  • Ha a 2. feltétel is visszatér , akkor kivégzik is.
  • Ha a 2. feltétel kiértékelése a következőt jelenti: , SQL kihagyja .

Példa a beágyazott HA utasításra: Három szám közül a legnagyobb. Ebben a példában három szám közül a legnagyobbat nyomtatjuk ki egy beágyazott ha utasítással. A számokat a deklarációs részben adjuk meg (Number = 10, 15 és 20), a maximumot pedig beágyazott ha utasításokkal olvassuk be.

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 Magyarázat:

  • Code 2-4. sor: Az 'a', 'b' és 'c' változók 'NUMBER'-ként való deklarálása és 10, 15 és 20 értékekkel való inicializálása.
  • Code 6. sor: A „Program elindult” utasítás kinyomtatása.
  • Code 7. sor: Az 1. feltétel ellenőrzése, hogy 'a' nagyobb-e, mint 'b'.
  • Code 10. sor: Ha az 'a' nagyobb, mint 'b', akkor a nested-if 1 ellenőrzi, hogy 'a' nagyobb-e, mint 'c'.
  • Code 11-13. sor: Ha az „a” továbbra is nagyobb, akkor az „A a legnagyobb” jelenik meg; egyébként a „C a legnagyobb” jelenik meg.
  • Code 18. sor: Ha a feltétel1 hamis értéket ad vissza, a nested-if 2 ellenőrzi, hogy a 'b' nagyobb-e, mint a 'c'.
  • Code 19-21. sor: Ha a 'b' nagyobb, mint a 'c', akkor a 'B a legnagyobb' felirat jelenik meg; egyébként a 'C a legnagyobb' felirat.
  • Code 24. sor: A „Program befejeződött” utasítás kinyomtatása.

Kód kimenete:

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

Döntéshozatali nyilatkozatok összehasonlítása

Az alábbi táblázat összefoglalja a tárgyalt különféle feltételes utasításokat, így egy adott helyzethez kiválasztható a megfelelő.

típus Leírás Használat
HA AKKOR Logikai feltételt ellenőriz; ha IGAZ, akkor a 'THEN' blokkban lévő kód végrehajtódik. Egy adott blokk kihagyása vagy végrehajtása a feltétel alapján.
HA-AKKOR-MÁS Logikai feltételt ellenőriz; ha IGAZ, akkor a 'THEN' blokk, ha HAMIS, akkor az 'ELSE' blokk fut le. Legmegfelelőbb „ez-vagy-az” helyzetben.
HA-AKKOR-ELSIF A feltételeket sorban ellenőrzi. Az első, IGAZ értéket visszaadó blokk végrehajtásra kerül. Ha egyik sem IGAZ, akkor az 'ELSE' blokk fut le. Több mint két alternatíva közüli választásra használták.
FÉSZESÍTETT-HA Lehetővé teszi egy vagy több IF-THEN vagy IF-THEN-ELSIF utasítás használatát egy másikban. Főként beágyazott állapotban használják.

GYIK

Az ELSIF egy lapos, egymást kizáró feltételekből álló sorozatot tesztel. Egy beágyazott HA függvény egy feltételt egy másikba helyez, így a belső teszt csak azután fut le, hogy a külső már IGAZ értékű.

Egy NULL értéket adó feltételt FALSE-ként kezel a rendszer, így a THEN blokkját kihagyja. Ez akkor fontos, ha az összehasonlított érték null lehet, mivel az ág nem úgy fog futni, ahogyan egy kezdő elvárná.

A CASE (egyértelműen CASE) egyértelműbb, ha egy kifejezést több fix értékkel hasonlítunk össze. Az IF-THEN-ELSIF nem összefüggő tartományfeltételeknek felel meg. Mindkettő ugyanazt a logikát fejezheti ki, de a CASE jobban olvasható az értékegyeztetés során.

Igen. A mesterséges intelligencia képes a beágyazott IF-eket ELSIF-lánccá vagy CASE-sé lapítani, és olyan feltételeket is észrevenni, amelyek soha nem érhetők el. Teszteld az átírást, mert az átrendezési feltételek megváltoztathatják, hogy melyik ág fut le.

Az END IF jelzi a feltételes blokk végét, ami elengedhetetlen az IF-ek beágyazásakor. Enélkül a fordító nem tudja megmondani, hogy mely utasítások tartoznak a feltételhez, és hibát okoz.

Foglald össze ezt a bejegyzést a következőképpen: