Oracle PL/SQL KUI SIIS MUU Avaldus: ELSIF, NESTED-IF
Mis on otsustusavaldused?
Otsustusavaldused on need, kes otsustavad voo kontrolli รผle SQL tingimustel pรตhinevad avaldused. See annab programmeerijale parema kontrolli teatud koodi kรคivitamise takistamise (skeem 1) vรตi soovitud koodi valimise รผle tingimuse alusel (skeem 2). Allpool on "Otsuse tegemise avalduse" pilt.

Otsuste tegemise avalduste tรผรผbid:
Oracle pakub jรคrgmist tรผรผpi otsustusavaldusi.
- KUI-siis
- KUI-SIIS-MUI
- KUI-SIIS-ELSIF
- NESTED-IF
- CASE
- OTSITUD KOHTU
KUI-SIIS avaldus
IF-THEN-lauset kasutatakse peamiselt teatud koodijao tรคitmiseks ainult siis, kui tingimus on tรคidetud.
Tingimus peaks jรคrele andma Boolean (Tรตene/vale). See on pรตhitingimuslause, mis vรตimaldab ORACLE'il eelmรครคratletud tingimustel teatud koodijupi kรคivitada/vahele jรคtta.
IF THEN lausete sรผntaks:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_block> END if;
- รlaltoodud sรผntaksis jรคrgneb mรคrksรตnale "IF" tingimus, mille vรครคrtus on "TRUE"/"FALSE".
- Juhtseade teostab ainult siis, kui seisund taastub .
- Seisundi korral hindab siis jรคtab SQL vahele , ja see hakkab tรคitma ploki โEND IFโ kรตrval olevat koodi.
Mรคrge: Kui tingimus on hinnatud vรครคrtusele 'NULL', kรคsitleb SQL 'NULL'i kui 'FALSE'.
Nรคiteks 1: Selles nรคites prindime sรตnumi, kui number on suurem kui 100. Selleks kรคivitame jรคrgmise koodi
Sรตnumi printimiseks, kui numbri vรครคrtus on suurem kui 100, kรคivitame jรคrgmise koodi.
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 Selgitus:
- Code rida 2: Muutuja 'a' deklareerimine andmetรผรผbina 'NUMBER' ja selle initsialiseerimine vรครคrtusega '10'.
- Code rida 4: Lause โProgramm kรคivitatudโ printimine.
- Code rida 5: Kontrollitakse tingimust, kas muutuja 'a' on suurem kui '100'.
- Code rida 6: Kui 'a' on suurem kui '100', siis trรผkitakse tekst โa on suurem kui 100โ. Kui 'a' on vรคiksem vรตi vรตrdne 100-ga, siis tingimus ebaรตnnestub, seega รผlaltoodud trรผkilauset ignoreeritakse.
- Code rida 8: Trรผkitakse teade โProgramm on lรตpetatudโ.
Code Vรคljund:
Program started. Program completed.
Nรคide 2: Selles nรคites trรผkime sรตnumi, kui antud tรคhestik esineb inglise vokaalides (A, E, I, O, U).
Sรตnumi printimiseks, kui antud mรคrk on Vokaal, kรคivitame jรคrgmise koodi.
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;
/
Code Selgitus:
- Code rida 2: Muutuja 'a' deklareerimine '1' suuruse andmetรผรผbiga 'CHAR' ja selle lรคhtestamine vรครคrtusega 'u'.
- Code rida 4: Tingimuse kontrollimine, kas loendis on muutuja 'a' ('A', 'E', 'I', 'O', 'U').
- Vรครคrtus โaโ on enne vรตrdlemist teisendatud suurtรคhtedeks, et vรตrdlus ei oleks tรตstutundlik.
- Code rida 5: Kui loendis on 'a', siis trรผkitakse lause "Tรคhemรคrk on inglise hรครคlikutes". Kui tingimus ebaรตnnestus, siis see programm ei anna vรคljundit, kuna vรคljaspool IF-THEN plokki pole me vรคljastanud รผhtegi printimisavaldust.
Code Vรคljund:
The character is in English Vowels
KUI-SIIS-MUI avaldus
- Lauset IF-THEN-ELSE kasutatakse peamiselt tingimusel pรตhineva kahe alternatiivi vahel valimiseks.
- Allpool on lause IF-THEN-ELSE sรผntaksiesitus.
IF-THEN-ELSE lausete sรผntaks:
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;
- รlaltoodud sรผntaksis jรคrgneb mรคrksรตnale "IF" tingimus, mille vรครคrtus on "TRUE"/"FALSE".
- Juhtseade teostab ainult siis, kui seisund taastub .
- Seisundi korral hinnatakse siis kรคivitub SQL .
- Igal juhul tรคidetakse รผks kahest toiminguplokist.
Mรคrge: Kui tingimuse vรครคrtus on NULL, kรคsitleb SQL vรครคrtust NULL vรครคrtusena FALSE.
Nรคiteks 1: Selles nรคites prindime sรตnumi, kas antud arv on paaritu vรตi paaritu.
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;
/
Code Selgitus:
- Code rida 2: Muutuja 'a' deklareerimine andmetรผรผbina 'NUMBER' ja selle initsialiseerimine vรครคrtusega '11'.
- Code rida 4: Lause โProgramm kรคivitatudโ printimine.
- Code rida 5: Kontrollitakse tingimust, kas muutuja 'a' moodul '2' jรคrgi on 0.
- Code rida 6: Kui '0', siis trรผkitakse "a on paarisarv".
- Code rida 7: Kui mooduli vรครคrtus ei ole vรตrdne '0'-ga, siis tingimus tagastab vรครคrtuse , seega trรผkitakse teade โa on paaritu arvโ.
- Code rida10: Lause โProgramm on lรตpetatudโ printimine
Code Vรคljund:
Program started. a is odd number Program completed.
IF-THEN-ELSIF avaldus
- IF-THEN-ELSIF lauset kasutatakse peamiselt siis, kui alternatiivide hulgast tuleks valida รผks alternatiiv, kus igal alternatiivil on oma tingimused, mida tuleb tรคita.
- Esimesed tingimused, mis tagasi tulevad tรคidetakse ja รผlejรครคnud tingimused jรคetakse vahele.
- Lause IF-THEN-ELSIF vรตib sisaldada plokki ELSE. See ELSE plokk kรคivitatakse, kui รผkski tingimus ei ole tรคidetud.
mรคrkused: ELSE plokk on selles tingimuslauses valikuline. Kui ELSE plokki pole ja รผkski tingimus pole tรคidetud, jรคtab kontroller kogu toiminguploki vahele ja hakkab tรคitma รผlejรครคnud koodiosa.
IF-THEN-ELSIF-i lausete sรผntaks:
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;
- รlaltoodud sรผntaksis kรคivitab juhtelement kรคsu ainult siis, kui tingimus1 naaseb .
- Kui tingimus1 ei ole tรคidetud, kontrollib kontroller tingimust2.
- Kontroller vรคljub IF-avaldusest kahel jรคrgmisel juhul.
- Kui kontroller leidis mรตne tingimuse, mis taastub . Sel juhul kรคivitatakse vastav action_block ja kontroller vรคljub sellest IF-lause plokist ning hakkab tรคitma รผlejรครคnud koodi.
- Kui รผkski tingimus ei ole tรคidetud, kรคivitab kontroller ELSE ploki, kui see on olemas, seejรคrel vรคljub IF-lausest.
Mรคrge: Kui tingimuse vรครคrtus on NULL, kรคsitleb SQL vรครคrtust NULL vรครคrtusena FALSE.
Nรคide 1: Ilma ELSE blokita
Antud nรคites trรผkime hinde antud hinnete alusel ilma muu tingimuseta (hinne >= 70 Hinne A, hinne >=40 ja hinne<70 Hinne B, hinne >=35 ja hinne<40 Hinne 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 Selgitus:
- Code rida 2: Muutuja 'mark' deklareerimine andmetรผรผbiks 'NUMBER' ja selle initsialiseerimine vรครคrtusega '55'.
- Code rida 4: Lause โProgramm kรคivitatudโ printimine.
- Code rida 5: Tingimus 1 kontrollimine, kas 'mark' on suurem vรตi vรตrdne 70-ga.
- Code rida 7: Kuna tingimus 1 nurjus, siis kontrollitakse tingimust 2 '70>mark>=40โฒ.
- Code rida 8: Tingimus2 tagastab , seega trรผkitakse teade โHinne Bโ.
- Code rida 12: Lause โProgramm lรตpetatudโ printimine.
- Sel juhul jรคetakse tingimus3 'mark < 35' vahele, kuna kontroller leidis รผhe tingimuse, mis tagastab enne tingimust3.
Code Vรคljund:
Program started. Grade B Program completed.
Nรคiteks 2: ELSE plokiga
Antud nรคites trรผkime antud hinnete alusel hinde muu tingimusega (mรคrk >= 70 Hinne A, hinne >=40 ja hinne<70 Hinne B, hinne >=35 ja hinne<40 Hinne C, muidu "Hinnet pole").
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 Selgitus:
- Code rida 2: Muutuja 'mark' deklareerimine andmetรผรผbiks 'NUMBER' ja selle initsialiseerimine vรครคrtusega '25'.
- Code rida 4: Lause โProgramm kรคivitatudโ printimine.
- Code rida 5: Tingimus 1 kontrollimine, kas 'mark' on suurem vรตi vรตrdne 70-ga.
- Code rida 7: Kuna tingimus 1 nurjus, siis kontrollitakse tingimust 2 '70>mark>=40โฒ.
- Code rida 8: Kuna tingimus 2 nurjus, siis kontrollitakse tingimust 3 '40>mark>=35โฒ.
- Code rida 11: Kuna kรตik tingimused on ebaรตnnestunud, kontrollib juhtseade nรผรผd ELSE ploki olemasolu ja prindib ELSE plokist teate โHinne puudubโ.
- Code rida 14: Lause โProgramm lรตpetatudโ printimine.
Code Vรคljund:
Program started. No Grade Program completed.
NESTED-IF avaldus
- NESTED-IF avaldus lubab programmeerijatel pรตhimรตtteliselt paigutada รผhe vรตi mitu IF-tingimust teise IF-tingimuse sisse. muud kui tavalised avaldused.
- Igal tingimusel "IF" peaks olema eraldi lause "END IF", mis tรคhistab selle konkreetse ulatuse lรตppu .
- IF-lause kรคsitleb selle konkreetse tingimuse lรตpp-punktina lรคhimat lauset END IF.
- NESTED-IF-i piltkujutis on nรคidatud alloleval diagrammil.
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
Sรผntaksi selgitus:
- รlaltoodud sรผntaksis sisaldab vรคlimine IF oma tegevusplokis veel รผht IF-lauset.
- Tingimus1 tagastab , siis kรคivitatakse juhtimine ja kontrollib seisukorda1.
- Kui tingimus2 tagastab ka , siis ka hukatakse.
- Tingimuse2 korral hindab siis jรคtab SQL vahele .
Siin nรคeme nรคidet Nested Ifist -
Pesastatud-I-lause nรคide: suurim kolmest arvust
Selles nรคites trรผkime Nested-If-lause abil kolmest arvust suurima. Numbrid mรครคratakse deklareerimisosas, nagu nรคete allolevast koodist, st Number= 10,15 ja 20 ning maksimaalne arv tuuakse pesastatud-if-lausete abil.
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;
/
Code Selgitus:
- Code rida 2: Muutuja 'a' deklareerimine andmetรผรผbina 'NUMBER' ja selle initsialiseerimine vรครคrtusega '10'.
- Code rida 3: Muutuja 'b' deklareerimine andmetรผรผbina 'NUMBER' ja selle initsialiseerimine vรครคrtusega '15'.
- Code rida 4: Muutuja 'c' deklareerimine andmetรผรผbina 'NUMBER' ja selle initsialiseerimine vรครคrtusega '20'.
- Code rida 6: Lause โProgramm kรคivitatudโ printimine (rida 6).
- Code rida 7: Tingimus 1 kontrollimine, kas 'a' on suurem kui 'b' (rida 7).
- Code rida 10: Kui 'a' on suurem kui 'b', siis tingimus 'nested-if 1' kontrollib, kas 'a' on suurem kui 'c' (rida 10).
- Code rida 13: Kui 'a' on ikka suurem, siis trรผkitakse teade 'A on suurim' (rida 11). Vastasel juhul, kui tingimus 2 ebaรตnnestub, siis trรผkitakse teade 'C on suurim' (rida 13).
- Code rida 18: Kui tingimus 1 tagastab vรครคrtuse โvรครคrโ, siis kontrollib tingimus โnested-if 2โ-s, kas โbโ on suurem kui โcโ (rida 18).
- Code rida 21: Kui 'b' on suurem kui 'c', siis trรผkitakse teade 'B on suurim' (rida 19), vastasel juhul, kui tingimus 2 ebaรตnnestub, siis trรผkitakse teade 'C on suurim' (rida 21).
- Code rida 24: Trรผkitakse avaldus โProgramm on lรตpetatudโ (rida 24).
Koodi vรคljund:
Program started. Checking Nested-IF 2 C is greatest Program completed.
kokkuvรตte
Selles peatรผkis oleme รตppinud erinevaid otsustuslauseid ning nende sรผntaksit ja nรคiteid. Allolevas tabelis on kokkuvรตte erinevatest tingimuslikest vรคidetest, mida oleme arutanud.
| TรรP | KIRJELDUS | KASUTAMINE |
|---|---|---|
| KUI-siis | Kontrollib Boole'i โโtingimust, kui 'THEN' plokis kรคivitatakse kood TRUE. | Konkreetse koodi vahelejรคtmiseks/kรคivitamiseks tingimuse pรตhjal. |
| KUI-SIIS-MUI | Kontrollib Boole'i โโtingimust, kas kรคivitatakse kood TRUE plokis 'THEN', kui kรคivitatakse vale kood plokis ELSE. | Kรตige sobivam tingimusel โSEE-VรI-SEEโ. |
| KUI-SIIS-ELSIF | Kontrollib Boole'i โโtingimust jรคrjestikuses jรคrjekorras. Jada esimene plokk, mis tagastab tingimuse TRUE, kรคivitatakse. Kui รผkski jada tingimustest ei ole TRUE, siis kรคivitatakse kood plokis ELSE. | Kasutatakse enam kui kahe alternatiivi valimiseks enamasti. |
| NESTED-IF | Lubab รผhe vรตi mitu lauset IF-THEN vรตi IF-THEN-ELSIF mรตne muu IF-THEN vรตi IF-THEN-ELSIF lause sees. | Kasutatakse peamiselt pesatingimustes. |


