Oracle PL/SQL JOS NIIN MUU Lause: ELSIF, NESTED-IF

⚡ Älykäs yhteenveto

PL/SQL-päätöksentekolausekkeet ohjaavat totuusarvon ehdon perusteella sitä, mikä koodi suoritetaan. Oracle tarjoaa JOS-NIIN, JOS-NIIN-MUUTAIN, JOS-NIIN-ELSE ja NESTED-IF, joten ohjelma voi ohittaa lohkon, valita kahden polun välillä tai valita yhden vaihtoehdon monista.

  • 🔀 Tarkoitus: Ehto, joka palauttaa arvon TRUE tai FALSE, määrittää suorituksen kulun.
  • JOS-NIIN: Suorittaa lohkon vain, kun ehto on TOSI, muuten ohittaa sen.
  • ↔️ JOS-NIIN-MUUTA: Valitsee kahden lohkon välillä, toisen arvolle TOSI ja toisen arvolle EPÄTOSI.
  • 🪜 JOS-NIIN-ELSIJOS: Testaa ehtoja peräkkäin ja suorittaa ensimmäisen, joka on TOSI, sekä valinnaisen ELSE-arvon.
  • 🧩 SISÄKKÄINEN JOS: Sijoittaa JOS-lausekkeen toisen JOS-lausekkeen sisään yhdistettyjen ehtojen tapauksessa.
  • ⚠️ NULL-sääntö: Ehtoa, joka antaa tulokseksi NULL, käsitellään arvona FALSE.
  • 🔚 Terminaattori: Jokainen JOS-lauseke on suljettava vastaavalla END JOS -lausekkeella.

Oracle PL/SQL JOS NIIN MUUTEN ELSE ELSIF

Mitä päätöksentekolausunnot ovat?

Päätöksentekolausunnot päättävät tiedonkulun ohjauksesta SQL ehtoihin perustuvat lauseet. Ne antavat ohjelmoijalle paremman hallinnan tietyn lohkon suorittamisen estämisessä tai halutun lohkon valitsemisessa ehdon perusteella. Alla on kuvallinen esitys päätöksentekolauseesta.

Päätöksentekolausuntokaavio
Päätöksentekolausuntokaavio

Päätöksentekolausuntojen tyypit: Oracle tarjoaa seuraavat tyypit.

  • JOS SITTEN
  • JOS-NIIN-MUU
  • JOS-SIIN-ELSIF
  • NESTED-IF
  • CASE
  • HAETTU TAPAUS

Tämä opetusohjelma käsittelee IF-variantteja. CASE- ja haetut CASE-lomakkeet käsitellään tässä. PL/SQL CASE -lauseke opas.

JOS-SIIN -lausunto

IF-THEN-lauseketta käytetään tietyn koodin osan suorittamiseen vain, kun ehto täyttyy. Ehdon tulisi tuottaa boolean (Tosi/Epätosi) -arvo. Se on yksinkertainen ehtolause, jonka avulla Oracle suorittaa tai ohittaa koodipätkän ennalta määritellyn ehdon perusteella.

IF-THEN-lausekkeiden syntaksi:

IF <condition: returns Boolean>
THEN
-executed only if the condition returns TRUE
<action_block>
END IF;
  • Yllä olevassa syntaksissa avainsanaa 'JOS' seuraa ehto, joka antaa tulokseksi 'TOSI' tai 'EPÄTOSI'.
  • Ohjaus suorittaa vain jos tila palaa .
  • Jos ehto arvioidaan arvoksi , SQL ohittaa ja alkaa suorittaa koodia 'END IF' -lohkon jälkeen.

Huomautus: Aina kun ehto antaa tulokseksi 'NULL', SQL käsittelee 'NULL'-arvoa 'FALSE'-arvona.

Esimerkki 1: Tässä esimerkissä tulostamme viestin, kun luku on suurempi kuin 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 Selitys:

  • Code rivi 2: Muuttujan 'a' määrittäminen tietotyypiksi 'NUMBER' ja sen alustaminen arvolla '10'.
  • Code rivi 4: Tulostaa lauseen ”Ohjelma käynnistynyt”.
  • Code rivi 5: Tarkistetaan ehtoa, onko muuttuja 'a' suurempi kuin '100'.
  • Code rivi 6: Jos 'a' on suurempi kuin '100', tulostetaan ”a on suurempi kuin 100”. Jos 'a' on pienempi tai yhtä suuri kuin 100, ehto epäonnistuu ja tulostuslauseke ohitetaan.
  • Code rivi 8: Tulostaa lauseen ”Ohjelma valmis”.

Code lähtö:

Program started.
Program completed.

Esimerkki 2: Tässä esimerkissä tulostetaan viesti, jos annettu kirjain on englannin vokaali (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 Selitys:

  • Code rivi 2: Muuttujan 'a' määrittäminen muodossa 'CHAR', jonka koko on '1', ja sen alustaminen arvolla 'u'.
  • Code rivi 4: Tarkistetaan, onko muuttuja 'a' läsnä listassa ('A','E','I','O','U'). Muuttujan 'a' arvo muunnetaan isoiksi kirjaimiksi ennen vertailua, jotta vertailussa ei ole kirjainkokoeroa.
  • Code rivi 5: Jos listassa on 'a', tulostetaan teksti ”Merkki on englanninkielisissä vokaaleissa”. Jos ehto epäonnistuu, ohjelma ei anna tulosta, koska JOS-NIIN-lohkon ulkopuolella ei ole tulostuslauseketta.

Code lähtö:

The character is in English Vowels

JOS-NIIN-MUU -lausunto

IF-THEN-ELSE-lauseketta käytetään valitsemaan kahden vaihtoehdon välillä ehdon perusteella. Alla on syntaksi.

IF-THEN-ELSE-lauseiden syntaksi:

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;
  • Avainsanaa 'JOS' seuraa ehto, joka antaa tulokseksi 'TOSI' tai 'EPÄTOSI'.
  • Ohjaus suorittaa vain jos tila palaa .
  • Jos ehto arvioidaan arvoksi , SQL suorittaa .
  • Joka tapauksessa toinen kahdesta toimintolohkosta suoritetaan.

Huomautus: Aina kun ehto antaa tulokseksi 'NULL', SQL käsittelee 'NULL'-arvoa 'FALSE'-arvona.

Esimerkki 1: Tässä esimerkissä tulostamme, onko annettu luku pariton vai parillinen.

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 Selitys:

  • Code rivi 2: Muuttujan 'a' määrittäminen tietotyypiksi 'NUMBER' ja sen alustaminen arvolla '11'.
  • Code rivi 4: Tulostaa lauseen ”Ohjelma käynnistynyt”.
  • Code rivi 5: Tarkistetaan, onko muuttujan 'a' moduuli '2':lla 0.
  • Code rivi 6: Jos arvo on '0', tulostuu teksti ”a on parillinen luku”.
  • Code rivi 7: Jos moduluksen arvo ei ole yhtä suuri kuin '0', ehto palauttaa , joten tulostuu ”a on pariton luku”.
  • Code rivi 10: Tulostaa lauseen ”Ohjelma valmis”.

Code lähtö:

Program started.
a is odd number
Program completed.

IF-THEN-ELSIF-lausunto

  • IF-THEN-ELSIF-lauseketta käytetään, kun yksi vaihtoehto tulisi valita joukosta vaihtoehtoja, joissa jokaisella vaihtoehdolla on oma ehtonsa.
  • Ensimmäinen ehto, joka palaa suoritetaan ja loput ehdot ohitetaan.
  • IF-THEN-ELSIF-lauseke voi sisältää 'ELSE'-lohkon, joka suoritetaan, jos mikään ehdoista ei täyty.

Huomautus: ELSE-lohko on valinnainen. Jos ELSE-lohkoa ei ole eikä mikään ehdoista täyty, ohjain ohittaa kaikki toimintolohkot ja suorittaa jäljellä olevan koodin.

IF-THEN-ELSIF-lauseiden syntaksi:

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;
  • Ohjaus suorittaa vain jos ehto 1 palauttaa .
  • Jos ehto 1 ei täyty, ohjain tarkistaa ehdon 2 ja niin edelleen.
  • Ohjain poistuu IF-lauseesta, kun se löytää ehdon, joka palauttaa ja suorittaa vastaavan toimintolohkon, tai kun mikään ehto ei täyty ja MUUTEN-lohko (jos sellainen on) suoritetaan.

Huomautus: Aina kun ehto antaa tulokseksi 'NULL', SQL käsittelee 'NULL'-arvoa 'FALSE'-arvona.

Esimerkki 1: Ilman ELSE-lohkoa. Tässä esimerkissä tulostetaan arvosana annettujen arvosanojen perusteella ilman muuta ehtoa (arvosana >= 70 Arvosana A, arvosana >= 40 ja arvosana < 70 Arvosana B, arvosana >= 35 ja arvosana < 40 Arvosana 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 Selitys:

  • Code rivi 2: Muuttujan 'mark' määrittäminen tietotyypiksi 'NUMBER' ja sen alustaminen arvolla '55'.
  • Code rivi 4: Tulostaa lauseen ”Ohjelma käynnistynyt”.
  • Code rivi 5: Tarkistetaan ehto 1, onko 'merkki' suurempi tai yhtä suuri kuin 70.
  • Code rivi 7: Koska ehto 1 epäonnistui, tarkistetaan ehto 2 '70 > merkki >= 40′.
  • Code rivi 8: Ehto2 palauttaa , joten tulostuu viesti 'Arvosana B'.
  • Code rivi 12: Tulostaa lauseen ”Ohjelma valmis”. Ehto 3 'arvosana < 35' ohitetaan, koska TOSI-ehto on jo löytynyt.

Code lähtö:

Program started.
Grade B
Program completed.

Esimerkki 2: ELSE-lohkolla. Tässä esimerkissä tulostetaan arvosana annettujen arvosanojen perusteella käyttäen muuta ehtoa (arvosana >= 70 Arvosana A, arvosana >= 40 ja arvosana < 70 Arvosana B, arvosana >= 35 ja arvosana < 40 Arvosana C, muuten 'Ei arvosanaa').

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 Selitys:

  • Code rivi 2: Muuttujan 'mark' määrittäminen tietotyypiksi 'NUMBER' ja sen alustaminen arvolla '25'.
  • Code rivi 4: Tulostaa lauseen ”Ohjelma käynnistynyt”.
  • Code rivi 5: Tarkistetaan ehto 1, onko 'merkki' suurempi tai yhtä suuri kuin 70.
  • Code rivi 7: Koska ehto 1 epäonnistui, tarkistetaan ehto 2 '70 > merkki >= 40′.
  • Code rivi 9: Koska ehto 2 epäonnistui, tarkistetaan ehto 3 '40 > merkki >= 35′.
  • Code rivi 11: Koska kaikki ehdot epäonnistuivat, ohjaus tarkistaa ELSE-lohkon ja tulostaa 'Ei arvosanaa'.
  • Code rivi 14: Tulostaa lauseen ”Ohjelma valmis”.

Code lähtö:

Program started.
No Grade
Program completed.

NESTED-IF-lausunto

  • NESTED-IF-lauseke antaa ohjelmoijille mahdollisuuden sijoittaa yhden tai useamman 'IF'-ehdon toisen 'IF'-ehdon sisään. .
  • Jokaisella 'JOS'-ehdolla tulisi olla erillinen 'END IF' -lauseke, joka merkitsee kyseisen ehdon soveltamisalan loppua. .
  • 'IF'-lauseke pitää lähimpänä olevaa 'END IF' -lauseketta kyseisen ehdon päätepisteenä.
  • NESTED-IF-funktion kuvallinen esitys on esitetty alla.

Sisäkkäinen IF-lausekkeen työnkulku

Sisäkkäisen IF-lausekkeen rakenne

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

Syntaksiselitys:

  • Ulompi IF sisältää yhden IF-lausekkeen lisää toimintolohkossaan.
  • Jos ehto 1 palauttaa , ohjaus suorittaa ja tarkistaa kunnon 2.
  • Jos myös ehto2 palauttaa , sitten teloitetaan myös.
  • Jos ehto2 evaluoituu arvoon , SQL ohittaa .

Esimerkki sisäkkäisestä JOS-lauseesta: Suurin kolmesta luvusta. Tässä esimerkissä tulostetaan kolmesta luvusta suurin käyttämällä sisäkkäistä jos-lauseketta. Luvut annetaan määrittelyosassa (Number = 10, 15 ja 20), ja suurin noudetaan sisäkkäisillä jos-lausekkeilla.

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 Selitys:

  • Code rivi 2-4: Muuttujien 'a', 'b' ja 'c' määrittäminen muodossa 'NUMBER' ja niiden alustaminen lukuilla 10, 15 ja 20.
  • Code rivi 6: Tulostaa lauseen ”Ohjelma käynnistynyt”.
  • Code rivi 7: Tarkistetaan ehto 1, onko 'a' suurempi kuin 'b'.
  • Code rivi 10: Jos 'a' on suurempi kuin 'b', nested-if 1 tarkistaa, onko 'a' suurempi kuin 'c'.
  • Code rivi 11–13: Jos 'a' on edelleen suurempi, tulostetaan 'A on suurin'; muuten tulostetaan 'C on suurin'.
  • Code rivi 18: Jos ehto 1 palauttaa arvon epätosi, nested-if 2 tarkistaa, onko 'b' suurempi kuin 'c'.
  • Code rivi 19–21: Jos 'b' on suurempi kuin 'c', tulostetaan 'B on suurin'; muuten tulostetaan 'C on suurin'.
  • Code rivi 24: Tulostaa lauseen ”Ohjelma valmis”.

Koodin ulostulo:

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

Päätöksentekolausuntojen vertailu

Alla oleva taulukko kokoaa yhteen käsitellyt erilaiset ehtolauseet, jotta oikea voidaan valita tietyssä tilanteessa.

Tyyppi Tuotetiedot Käyttö
JOS SITTEN Tarkistaa loogisen ehdon; jos se on TOSI, 'NIIN'-lohkon koodi suoritetaan. Ohita tai suorita tietty lohko ehdon perusteella.
JOS-NIIN-MUU Tarkistaa loogisen ehdon; jos arvo on TOSI, 'NIIN'-lohko suoritetaan, ja jos arvo on EPÄTOSI, 'MUUTEN'-lohko suoritetaan. Sopivin 'tämä tai tuo' -tilanteessa.
JOS-SIIN-ELSIF Tarkistaa ehdot järjestyksessä. Ensimmäinen lohko, joka palauttaa arvon TRUE, suoritetaan. Jos mikään niistä ei ole TOSI, suoritetaan 'ELSE'-lohko. Käytetään valittaessa useammasta kuin kahdesta vaihtoehdosta.
NESTED-IF Sallii yhden tai useamman IF-THEN- tai IF-THEN-ELSIF-lausekkeen toisen sisällä. Käytetään pääasiassa sisäkkäisissä olosuhteissa.

UKK

ELSIF testaa tasaista sarjaa toisensa poissulkevia ehtoja. Sisäkkäinen JOS-testi sijoittaa yhden ehdon toisen sisään, joten sisempi testi suoritetaan vasta sen jälkeen, kun ulompi on jo TOSI.

Ehtoa, joka antaa tulokseksi NULL, käsitellään ehtona FALSE, joten sen THEN-lohko ohitetaan. Tällä on merkitystä silloin, kun verrattu arvo voi olla null, koska haara ei toimi aloittelijan odottamalla tavalla.

CASE on selkeämpi, kun yhtä lauseketta verrataan useisiin kiinteisiin arvoihin. IF-THEN-ELSIF sopii toisiinsa liittymättömiin arvoalueehtoihin. Molemmat voivat ilmaista saman logiikan, mutta CASE on parempi arvojen yhteensovittamisessa.

Kyllä. Tekoäly voi litistää sisäkkäisiä IF-funktioita ELSIF-ketjuksi tai CASE-ketjuksi ja havaita ehtoja, joita ei koskaan voida saavuttaa. Testaa uudelleenkirjoitusta, koska uudelleenjärjestelyehdot voivat muuttaa suoritettavaa haaraa.

END IF merkitsee ehdollisen lohkon loppukohdan, mikä on olennaista sisäkkäisiä JOS-lausekkeita käytettäessä. Ilman sitä kääntäjä ei pysty päättelemään, mitkä lauseet kuuluvat ehtoon, ja se aiheuttaa virheen.

Tiivistä tämä viesti seuraavasti: