Управляющие конструкции
Итоги
Практика №4!
Самостоятельное изучение: CASE
Самостоятельное изучение: GOTO
327.50K

Управляющие конструкции PL/SQL

1. Управляющие конструкции

4
Управляющие конструкции

2.

Управление процессом выполнения IF
• Используются для изменения логической
последовательности выполнения команд
• Условные операторы IF:
• IF-THEN
• IF-THEN-ELSE
• IF-THEN-ELSIF
• IF-THEN-ELSIF-ELSE

3.

Конструкции IF
IF 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-ELSE
TRUE
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-ELSIF
TRUE
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.

LOOP
LOOP
statement1;
. . .
EXIT [WHEN condition]; --условие выхода
END LOOP;
condition – булево выражение или инструкция,
возвращающее TRUE или FALSE

16.

Пример LOOP
DECLARE
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.

WHILE
WHILE 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.

Цикл FOR
FOR 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_
English     Русский Rules