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;
/
Code Обяснение:
- Code ред 2: Деклариране на променливата 'a' като тип данни 'NUMBER' и инициализирането ѝ със стойност '10'.
- Code ред 4: Отпечатване на оператора „Програмата е стартирана“.
- Code ред 5: Проверка на условието, дали променливата 'a' е по-голяма от '100'.
- Code ред 6: Ако 'a' е по-голямо от '100', тогава ще се отпечата „a е по-голямо от 100“. Ако 'a' е по-малко или равно на 100, тогава условието не е изпълнено, така че горният оператор за отпечатване се игнорира.
- Code ред 8: Отпечатване на оператора „Програмата е завършена“.
Code Изход:
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;
/
Code Обяснение:
- Code ред 2: Деклариране на променливата 'a' като 'CHAR' от тип данни с размер '1' и инициализиране със стойност 'u'.
- Code ред 4: Проверка на условието дали променлива 'a' присъства в списъка ('A','E','I','O','U').
- Стойността на „a“ е преобразувана в главни букви преди сравнение, за да направи сравнението нечувствително към главни и малки букви.
- Code ред 5: Ако 'a' присъства в списъка, тогава ще бъде отпечатано изявлението “Знакът е в английски гласни”. Ако условието е неуспешно, тогава тази програма няма да даде никакъв изход, тъй като извън блока IF-THEN не сме издали никакво изявление за печат.
Code Изход:
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;
/
Code Обяснение:
- Code ред 2: Деклариране на променливата 'a' като тип данни 'NUMBER' и инициализирането ѝ със стойност '11'.
- Code ред 4: Отпечатване на оператора „Програмата е стартирана“.
- Code ред 5: Проверка на условието дали модулът на променливата 'a' от '2' е 0.
- Code ред 6: Ако е '0', тогава ще се отпечата „a е четно число“.
- Code ред 7: Ако стойността на модула не е равна на '0', тогава условието връща , така че ще се отпечата съобщението „a е нечетно число“.
- Code ред10: Отпечатване на изявлението „Програмата е завършена“
Code Изход:
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; /
Code Обяснение:
- Code ред 2: Деклариране на променливата „mark“ като тип данни „NUMBER“ и инициализирането ѝ със стойност „55“.
- Code ред 4: Отпечатване на оператора „Програмата е стартирана“.
- Code ред 5: Проверка на условие1, дали 'mark' е по-голямо или равно на 70.
- Code ред 7: Тъй като условие1 е неуспешно, тогава условие2 '70>mark>=40′ е проверено.
- Code ред 8: Условието2 връща , следователно ще се отпечата съобщението „Степен Б“.
- Code ред12: Отпечатване на изявлението „Програмата е завършена“.
- В този случай условие3 'маркировка < 35' ще бъде пропуснато, тъй като контролерът намери едно условие, което връща преди условие3.
Code Изход:
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; /
Code Обяснение:
- Code ред 2: Деклариране на променливата „mark“ като тип данни „NUMBER“ и инициализирането ѝ със стойност „25“.
- Code ред 4: Отпечатване на оператора „Програмата е стартирана“.
- Code ред 5: Проверка на условие 1, дали 'mark' е по-голямо или равно на 70.
- Code ред 7: Тъй като условие1 е неуспешно, тогава условие2 '70>mark>=40′ е проверено.
- Code ред 8: Тъй като условие2 е неуспешно, тогава условие3 '40>mark>=35′ е проверено.
- Code ред 11: Тъй като всички условия са неуспешни, управлението ще провери за наличие на блок ELSE и ще отпечата съобщението „Без оценка“ от блока ELSE.
- Code ред14: Отпечатване на изявлението „Програмата е завършена“.
Code Изход:
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;
/
Code Обяснение:
- Code ред 2: Деклариране на променливата 'a' като тип данни 'NUMBER' и инициализирането ѝ със стойност '10'.
- Code ред 3: Деклариране на променливата 'b' като тип данни 'NUMBER' и инициализирането ѝ със стойност '15'.
- Code ред 4: Деклариране на променливата 'c' като тип данни 'NUMBER' и инициализирането ѝ със стойност '20'.
- Code ред 6: Отпечатване на оператора „Програмата е стартирана“ (ред 6).
- Code ред 7: Проверка на условие1, дали 'a' е по-голямо от 'b' (ред 7).
- Code ред 10: Ако 'a' е по-голямо от 'b', тогава условието в 'nested-if 1' ще провери дали 'a' е по-голямо от 'c' (ред 10).
- Code ред 13: Ако все още 'a' е по-голямо, тогава ще се отпечата съобщението 'A е най-голямо' (ред 11). В противен случай, ако условие2 не е изпълнено, тогава ще се отпечата 'C е най-голямо' (ред 13).
- Code ред 18: В случай че condition1 върне false, тогава condition в 'nested-if 2' ще провери дали 'b' е по-голямо от 'c' (ред 18).
- Code ред 21: Ако 'b' е по-голямо от 'c', тогава ще се отпечата съобщението 'B е най-голямо' (ред 19), в противен случай, ако условие2 не е изпълнено, тогава ще се отпечата 'C е най-голямо' (ред 21).
- Code ред 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. | Използва се главно в ситуация на вложено състояние. |


