Similar presentations:
Управляющие конструкции PL/SQL
1. Управляющие конструкции
4Управляющие конструкции
2.
Управление процессом выполнения IF• Используются для изменения логической
последовательности выполнения команд
• Условные операторы IF:
• IF-THEN
• IF-THEN-ELSE
• IF-THEN-ELSIF
• IF-THEN-ELSIF-ELSE
3.
Конструкции IFIF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;
Пример:
IF UPPER(v_ename) = ’OSBORNE’
THEN
v_mgr := 22;
END IF;
4.
Простой IFПример:
. . .
IF v_ename = 'MILLER' THEN
v_job := 'SALESMAN';
v_deptno := 35;
v_new_sal = sal*2;
END IF;
. . .
5.
Составное условие IFПример:
. . .
IF v_ename = 'MILLER' AND
salary > 6500
THEN
v_deptno := 60;
END IF;
. . .
6.
IF-THEN-ELSETRUE
FALSE
IF условие
THEN действие
ELSE действие
7.
IF-THEN-ELSE (пример)Пример:
DECLARE
v_hiredate DATE := '12-Dec-1990';
v_five_years BOOLEAN;
BEGIN
...
IF MONTHS_BETWEEN(SYSDATE,v_hiredate)/12 > 5 THEN
v_five_years := TRUE;
ELSE
v_five_years := FALSE;
END IF;
...
8.
IF-THEN-ELSIFTRUE
FALSE
IF условие
TRUE
ELSIF условие
FALSE
THEN действие
THEN действие
ELSE действие
9.
IF-THEN-ELSIF (пример)Пример:
...
IF
v_start
v_start
ELSIF v_start
v_start
ELSE
v_start
END IF;
...
> 100 THEN
:= 0.2 * v_start;
>= 50 THEN
:= 0.5 * v_start;
:= 0.1 * v_start;
10.
Работа с NULL значениями• Сравнение с NULL
• Обработка пустых значений (NULL) с использованием IS NULL , IS NOT NULL
• Составление конкатенированных выражений используя NULL значения.
* нюансы… NULL
https://habrahabr.ru/post/127327/
Оператор OR:
( null or true ); -- TRUE
( null or false ); -- UNKNOWN
( null or null ); -- UNKNOWN
Оператор AND:
( null and true ); -- UNKNOWN
( null and false ); -- FALSE
( null and null ); -- UNKNOWN
11.
Обработка NULL значенийПростые сравнения, имеющие NULL значения всегда
возвращают NULL. Если в IF используется сравнение с
NULL, то и результат будет NULL.
Применение логического оператора NOT к пустым
выражениям выдает NULL.
declare
x integer := 5;
y integer ; -- не инициализация соотв. := NULL;
begin
IF (x != y)
THEN --результат NULL, не TRUE
-- IF NOT(x != y)
THEN --результат NOT NULL, не TRUE
-- IF NOT(x != y) or (1=1) THEN --результат TRUE!!!
dbms_output.put_line('inside then');
ELSE
dbms_output.put_line('inside else');
END IF;
end;
PL/SQL procedure successfully completed.
inside else
inside else
12.
Логические таблицыAND
TRUE
FALSE
NULL
NOT
TRUE
TRUE
FALSE
NULL
TRUE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
TRUE
NULL
NULL
NULL
NULL
FALSE
NULL
OR
TRUE
FALSE
NULL
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
FALSE
NULL
NULL
TRUE
NULL
NULL
13.
Условия с булевыми значениямиПример:
v_flag := v_reorder_flag AND v_available_flag;
v_reorder_flag
v_available_flag
v_flag
TRUE
TRUE
TRUE
TRUE
FALSE
FALSE
NULL
TRUE
NULL
NULL
FALSE
FALSE
14.
Управление итерациями• Циклы повторяют инструкцию или
последовательность операций в течении
указанного количества раз.
• В PL/SQL существует три типа цикла:
• Основной цикл (LOOP)
• Цикл FOR
• Цикл WHILE
15.
LOOPLOOP
statement1;
. . .
EXIT [WHEN condition]; --условие выхода
END LOOP;
condition – булево выражение или инструкция,
возвращающее TRUE или FALSE
16.
Пример LOOPDECLARE
v_ordid item.ordid%TYPE := 601;
v_counter NUMBER(2) := 1;
BEGIN
LOOP
INSERT INTO item(ordid, itemid)
VALUES(v_ordid, v_counter);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 10;
END LOOP;
END;
* EXIT блоков м.б. не один, условия м.б. разными
* EXIT м.б. безусловным EXIT;
* В циклах FOR и WHILE не рекомендуется использование EXIT,
ухучшается отладка и поддержка кода.
17.
WHILEWHILE condition LOOP
statement1;
statement2;
. . .
END LOOP;
condition – условие выполнения для каждой
итерации, до тех пор пока верно выполняется
цикл (принимает значения TRUE или FALSE)
18.
WHILE (пример)DECLARE
v_counter NUMBER(3) := 1;
BEGIN
WHILE v_counter <= 10 Loop
--EXIT;
INSERT INTO tmp(id, name)
VALUES(v_counter, 'TMP'||v_counter);
v_counter := v_counter + 1;
--EXIT WHEN v_counter > 10;
--EXIT WHEN v_counter > 2;
END LOOP;
END;
19.
Цикл FORFOR counter IN [REVERSE] lower..upper
LOOP
statement1;
statement2;
. . .
END LOOP;
lower – начальное значение итерации
upper – конечное значение итерации
counter – счетчик итераций, объявление не
обязательно.
20.
FOR - рекомендации• Счетчик можно не объявлять в блоке DECLARE
• Ссылка на счётчик разрешается только в пределах
цикла.
• Для задания интервала может использоваться
выражение.
• Не следует присваивать счетчику значения
21.
FOR (пример)DECLARE
v_counter NUMBER(3) := 1;
BEGIN
FOR iasasd in 1 .. 10 LOOP
INSERT INTO tmp(id, name) VALUES(iasasd,'TMP'||
iasasd);
--EXIT WHEN v_counter > 1;
--v_counter:=iasasd;
END LOOP;
--v_counter:=iasasd;
END;
22.
Рекомендациипо использованию циклов
• Для циклов, которые необходимо выполнить хотя
бы 1 раз - простой LOOP
• Используем WHILE если необходимо проверять
условие перед каждой итерацией
• Используем FOR если точно известно количество
итераций
23.
Вложенные циклы и метки• В PL/SQL существует возможность вкладывать циклы друг
в друга.
• Для различия между блоками и циклами используются
метки.
• В случае использования меток, выход из цикла
осуществляется по меткам:
...
END LOOP my_label;
24.
Вложенные циклы и метки (пример)DECLARE
v_counter
integer:=1;
v_counter_i integer:=1;
BEGIN
<<outer_loop>>
LOOP
v_counter := v_counter + 1;
v_counter_i:=1;
<<inner_loop>>
LOOP
v_counter_i := v_counter_i + 1;
EXIT outer_loop WHEN v_counter_i=5;
EXIT WHEN v_counter_i = 10;
END LOOP inner_loop;
EXIT WHEN v_counter = 10;
END LOOP outer_loop;
dbms_output.put_line(v_counter);
dbms_output.put_line(v_counter_i);
END;
25.
CONTINUE : переход к следующейитерации цикла
DECLARE
BEGIN
FOR iasasd in 1 .. 10 LOOP
IF iasasd >3 and iasasd <=8
CONTINUE;
END IF;
INSERT INTO tmp(id, name)
VALUES(iasasd, 'TMP'||iasasd);
END LOOP;
END;
select * from TMP ;
1
2
3
9
10
TMP1
TMP2
TMP3
TMP9
TMP10
THEN
26. Итоги
Научились работать с операторами изменяющимилогическую последовательность команд
• Условные операторы IF
• Циклы
– LOOP
– FOR
– WHILE
• EXIT
27. Практика №4!
40 минут28. Самостоятельное изучение: CASE
CASE в стандарте SQL с 1992 года, в с версии Oracle8, в PL/SQL — с Oracle9.Поддерживаются следующие разновидности команд CASE:
Простая команда CASE — связывает одну или несколько последовательностей команд PL/SQL с соответствующими значениями .
Поисковая команда CASE — выбирает для выполнения одну или несколько последовательностей команд в зависимости от результатов проверки списка логических
значений. Выполняется последовательность команд, связанная с первым условием,
результат проверки которого оказался равным TRUE.
Простые команды CASE
CASE employee_type
WHEN 'S' THEN
award_salary_bonus(employee_id);
WHEN 'H' THEN
award_hourly_bonus(employee_id);
ELSE
RAISE invalid_employee_type;
END CASE;
Поисковая команда CASE
CASE
WHEN salary > 20000 AND salary <= 40000
THEN give_bonus(employee_id, 1000);
WHEN salary > 40000
THEN give_bonus(employee_id, 500);
ELSE
give_bonus(employee_id, 0);
END CASE;
29. Самостоятельное изучение: GOTO
Команда GOTO выполняет безусловный переход к другой исполняемойкоманде в том же исполняемом разделе блока PL/SQL. Общий формат команды
GOTO:
GOTO имя_метки;
На использование команды GOTO налагаются ограничения:
- За меткой должна следовать хотя бы одна исполняемая команда.
- Целевая метка должна находиться в пределах области действия оператора
GOTO.
- Целевая метка должна находиться в той же части блока PL/SQL, что и
оператор GOTO.
BEGIN
GOTO second_output;
DBMS_OUTPUT.PUT_LINE('Эта строка никогда не выполняется.');
<<second_output>>
DBMS_