Oracle PL/SQL IF THEN ELSE оператор: ELSIF, NESTED-IF
Какво представляват изявленията за вземане на решения?
Изявленията за вземане на решения са тези, които ще решат контрола на потока SQL изявления въз основа на условията. Той дава на програмиста по-добър контрол върху предотвратяването на изпълнението на определен код (диаграма 1) или избора на желан код въз основа на условието (диаграма 2). По-долу е графичното представяне на „Декларацията за вземане на решение“.

Видове изявления за вземане на решения:
Oracle предоставя следните типове изявления за вземане на решения.
- АКО-ТОГАВА
- АКО-ТОГДА-ИНАЧЕ
- АКО-ТОГДА-ЕЛСИФ
- ВГНЕДЕНО-АКО
- CASE
- ТЪРСЕН СЛУЧАЙ
Твърдение АКО-ТОГАВА
Операторът IF-THEN се използва главно за изпълнение на определена секция от кодове само когато условието е изпълнено.
Условието трябва да отстъпи Булева (Вярно/Невярно). Това е основен условен оператор, който ще позволи на ORACLE да изпълни/пропусне определена част от код въз основа на предварително дефинирани условия.
Синтаксис за изразите IF THEN:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_block> END if;
- В горния синтаксис ключовата дума 'IF' ще бъде последвана от условие, което се оценява на 'TRUE'/'FALSE'.
- Контролът ще изпълни само ако състоянието се върне .
- В случай на състояние се оценява на тогава SQL ще пропусне и ще започне да изпълнява кода до блока „КРАЙ АКО“.
Забележка: Всеки път, когато условието е оценено на 'NULL', тогава SQL ще третира 'NULL' като 'FALSE'.
Пример 1: В този пример ще отпечатаме съобщение, когато числото е по-голямо от 100. За целта ще изпълним следния код
За да отпечатаме съобщение, когато число има стойност над 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; /
Обяснение на кода:
- Кодов ред 2: Деклариране на променливата 'a' като тип данни 'NUMBER' и инициализиране със стойност '10'.
- Кодов ред 4: Отпечатване на израза „Програмата стартира“.
- Кодов ред 5: Проверка на условието, дали променлива 'a' е по-голяма от '100.'
- Кодов ред 6: Ако „a“ е по-голямо от „100“, тогава ще бъде отпечатано „a е по-голямо от 100“. Ако 'a' е по-малко или равно на 100, тогава условието е неуспешно, така че горният израз за печат се игнорира.
- Кодов ред 8: Отпечатване на съобщението „Програмата е завършена“.
Изходен код:
Program started. Program completed.
Пример 2: В този пример ще отпечатаме съобщение, ако дадена азбука присъства в английски гласни (A, E, I, O, U).
За да отпечатаме съобщение, когато дадения знак е гласна, изпълняваме следния код.
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; /
Обяснение на кода:
- Кодов ред 2: Деклариране на променливата 'a' като 'CHAR' от тип данни с размер '1' и инициализиране със стойност 'u'.
- Кодов ред 4: Проверка на условието дали променлива 'a' присъства в списъка ('A','E','I','O','U').
- Стойността на „a“ е преобразувана в главни букви преди сравнение, за да направи сравнението нечувствително към главни и малки букви.
- Кодов ред 5: Ако 'a' присъства в списъка, тогава ще бъде отпечатано изявлението “Знакът е в английски гласни”. Ако условието е неуспешно, тогава тази програма няма да даде никакъв изход, тъй като извън блока IF-THEN не сме издали никакво изявление за печат.
Изходен код:
The character is in English Vowels
Твърдение IF-THEN-ELSE
- Операторът IF-THEN-ELSE се използва главно за избор между две алтернативи въз основа на условието.
- По-долу е синтаксисът на оператора IF-THEN-ELSE.
Синтаксис за операторите 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;
- В горния синтаксис ключовата дума 'IF' ще бъде последвана от условие, което се оценява на 'TRUE'/'FALSE'.
- Контролът ще изпълни само ако състоянието се върне .
- В случай на състояние се оценява на тогава SQL ще се изпълни .
- Във всеки случай един от двата блока за действие ще бъде изпълнен.
Забележка: Всеки път, когато условието се оценява като „NULL“, тогава SQL ще третира „NULL“ като „FALSE“.
Пример 1: В този пример ще отпечатаме съобщение дали даденото число е четно или нечетно.
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; /
Обяснение на кода:
- Кодов ред 2: Деклариране на променливата 'a' като тип данни 'NUMBER' и инициализиране със стойност '11'.
- Кодов ред 4: Отпечатване на израза „Програмата стартира“.
- Кодов ред 5: Проверка на условието дали модулът на променлива 'a' от '2' е 0.
- Кодов ред 6: Ако '0', тогава ще бъде отпечатано "a е четно число".
- Кодов ред 7: Ако стойността на модула не е равна на „0“, тогава условието се връща , така че ще бъде отпечатано съобщението „a е нечетно число“.
- Кодов ред10: Отпечатване на изявлението „Програмата е завършена“
Изходен код:
Program started. a is odd number Program completed.
Изявление IF-THEN-ELSIF
- Изявлението IF-THEN-ELSIF се използва главно, когато една алтернатива трябва да бъде избрана от набор от алтернативи, където всяка алтернатива има свои собствени условия, които трябва да бъдат изпълнени.
- Първите условия, които се връщат ще се изпълни, а останалите условия ще бъдат пропуснати.
- Операторът IF-THEN-ELSIF може да съдържа блок 'ELSE' в него. Този блок „ELSE“ ще бъде изпълнен, ако нито едно от условията не е изпълнено.
Забележка: Блокът ELSE не е задължителен в този условен оператор. Ако няма блок ELSE и нито едно от условията не е изпълнено, тогава контролерът ще пропусне всички блокове за действие и ще започне да изпълнява останалата част от кода.
Синтаксис за операторите 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;
- В горния синтаксис контролата ще изпълни само ако условието1 се върне .
- Ако условие1 не е изпълнено, тогава контролерът ще провери за условие2.
- Контролерът ще излезе от оператора IF в следните два случая.
- Когато контролерът намери някакво състояние, което се връща . В този случай съответният блок action_block ще бъде изпълнен и контролерът ще излезе от този блок с инструкции IF и ще започне да изпълнява оставащия код.
- Когато нито едно от условията не е изпълнено, тогавашният контролер ще изпълни блок ELSE, ако е наличен, след което ще излезе от оператора IF.
Забележка: Всеки път, когато условието се оценява като „NULL“, тогава SQL ще третира „NULL“ като „FALSE“.
Пример 1: Без блок ELSE
В този пример ще отпечатаме оценката въз основа на дадените оценки без друго условие (маркировка >= 70 степен A, оценка >=40 и оценка <70 степен B, оценка >=35 и оценка <40 степен 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; /
Обяснение на кода:
- Кодов ред 2: Деклариране на променливата 'mark' като тип данни 'NUMBER' и инициализиране със стойност '55'.
- Кодов ред 4: Отпечатване на израза „Програмата стартира“.
- Кодов ред 5: Проверка на условие1, дали „маркировката“ е по-голяма или равна на 70.
- Кодов ред 7: Тъй като условие1 е неуспешно, тогава се проверява условие2 '70>mark>=40'.
- Кодов ред 8: Condtition2 се връща , следователно ще бъде отпечатано съобщението „Степен B“.
- Кодов ред12: Отпечатване на съобщението „Програмата е завършена“.
- В този случай условие3 'маркировка < 35' ще бъде пропуснато, тъй като контролерът намери едно условие, което връща преди условие3.
Изходен код:
Program started. Grade B Program completed.
Пример 2: С блок ELSE
В този пример ще отпечатаме оценката въз основа на дадените оценки с друго условие (маркировка >= 70 степен A, оценка >=40 и оценка <70 степен B, оценка >=35 и оценка <40 степен C, иначе „Без оценка“).
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; /
Обяснение на кода:
- Кодов ред 2: Деклариране на променливата 'mark' като тип данни 'NUMBER' и инициализиране със стойност '25'.
- Кодов ред 4: Отпечатване на израза „Програмата стартира“.
- Кодов ред 5: Проверка на условие 1, дали „маркировката“ е по-голяма или равна на 70.
- Кодов ред 7: Тъй като условие1 е неуспешно, тогава се проверява условие2 '70>mark>=40'.
- Кодов ред 8: Тъй като условие2 е неуспешно, тогава се проверява условие3 '40>mark>=35'.
- Кодов ред 11: Тъй като всички условия не са изпълнени, управлението сега ще провери за наличието на блок ELSE и ще отпечата съобщението „Без оценка“ от блок ELSE.
- Кодов ред14: Отпечатване на съобщението „Програмата е завършена“.
Изходен код:
Program started. No Grade Program completed.
Изявление NESTED-IF
- Операторът NESTED-IF по същество позволява на програмистите да поставят едно или повече условия „АКО“ в друго условие „АКО“ различни от нормалните изявления.
- Всяко условие „АКО“ трябва да има отделен израз „КРАЙ АКО“, който маркира края на обхвата на това конкретно .
- Операторът 'IF' ще разглежда най-близкия оператор 'END IF' като крайна точка за това конкретно условие.
- Картинното представяне на NESTED-IF е показано на диаграмата по-долу.
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
Обяснение на синтаксиса:
- В горния синтаксис външният IF съдържа още един оператор IF в своя блок за действие.
- Условието1 се връща , тогава контролът ще се изпълнява и проверява условието1.
- Ако условие2 също се връща , тогава също ще бъдат изпълнени.
- В случай на условие2 се оценява на тогава SQL ще пропусне .
Тук ще видим пример за Nested If –
Пример за вложен оператор If: Най-голямото от три числа
В този пример ще отпечатаме най-голямото от три числа, като използваме оператора Nested-If. Числата ще бъдат присвоени в частта за деклариране, както можете да видите в кода по-долу, т.е. Number= 10,15 и 20 и максималният брой ще бъде извлечен с помощта на вложени оператори 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; /
Обяснение на кода:
- Кодов ред 2: Деклариране на променливата 'a' като тип данни 'NUMBER' и инициализиране със стойност '10'.
- Кодов ред 3: Деклариране на променливата 'b' като тип данни 'NUMBER' и инициализиране със стойност '15'.
- Кодов ред 4: Деклариране на променливата 'c' като тип данни 'NUMBER' и инициализиране със стойност '20'.
- Кодов ред 6: Отпечатване на израза „Програмата стартира“ (ред 6).
- Кодов ред 7: Проверка на условие1, дали 'a' е по-голямо от 'b' (ред 7).
- Кодов ред 10: Ако "a" е по-голямо от "b", тогава условието в "nested-if 1" ще провери дали "a" е по-голямо от "c" (ред 10).
- Кодов ред 13: Ако все още „a“ е по-голямо, тогава ще бъде отпечатано съобщение „A е най-голямото“ (ред 11). В противен случай, ако условие2 е неуспешно, тогава ще бъде отпечатано „C е най-голямото“ (ред 13).
- Кодов ред 18: В случай че условие1 връща false, тогава условието във „вложено ако 2“ ще провери дали „b“ е по-голямо от „c“ (ред 18).
- Кодов ред 21: Ако 'b' е по-голямо от 'c', тогава ще бъде отпечатано съобщение 'B е най-голямото' (ред 19), в противен случай, ако условие2 е неуспешно, тогава ще бъде отпечатано 'C е най-голямото' (ред 21).
- Кодов ред 24: Отпечатване на съобщението „Програмата е завършена“ (ред 24).
Изход на код:
Program started. Checking Nested-IF 2 C is greatest Program completed.
Oбобщение
В тази глава научихме различните изявления за вземане на решения и техния синтаксис и примери. Таблицата по-долу дава обобщение на различни условни твърдения, които сме обсъждали.
ТИП | ОПИСАНИЕ | ИЗПОЛЗВАНЕ |
---|---|---|
АКО-ТОГАВА | Проверява за булево условие, ако кодът TRUE в блока „THEN“ ще бъде изпълнен. | За да пропуснете,/изпълните определен код въз основа на условието. |
АКО-ТОГДА-ИНАЧЕ | Проверява за булево условие, ако ще се изпълни TRUE код в блока 'THEN', ако се изпълни грешен код в блока 'ELSE'. | Най-подходящ в състояние „ТОВА-ИЛИ-ОНОВА“. |
АКО-ТОГДА-ЕЛСИФ | Проверява за булево условие в последователен ред. Ще бъде изпълнен първият блок в последователността, който връща условие TRUE. Ако никое от условията в последователността не е TRUE, тогава се изпълнява кодът в блока „ELSE“. | Използва се предимно за избор от повече от две алтернативи. |
ВГНЕДЕНО-АКО | Позволява един или повече оператори IF-THEN или IF-THEN-ELSIF в други изрази IF-THEN или IF-THEN-ELSIF. | Използва се главно в ситуация на вложено състояние. |