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

Содержание

Слайд 2

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

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

Управление процессом выполнения

IF
Слайд 3

IF condition THEN statements; [ELSIF condition THEN statements;] [ELSE statements;] END

IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;

Конструкции IF

Пример:
IF UPPER(v_ename) = ’OSBORNE’
THEN


v_mgr := 22;
END IF;
Слайд 4

Пример: . . . IF v_ename = 'MILLER' THEN v_job :=

Пример:
. . .
IF v_ename = 'MILLER' THEN
v_job := 'SALESMAN';
v_deptno := 35;
v_new_sal

= sal*2;
END IF;
. . .

Простой IF

Слайд 5

Пример: . . . IF v_ename = 'MILLER' AND salary >

Пример:
. . .
IF v_ename = 'MILLER' AND salary > 6500
THEN
v_deptno

:= 60;
END IF;
. . .

Составное условие IF

Слайд 6

IF-THEN-ELSE IF условие THEN действие ELSE действие TRUE FALSE

IF-THEN-ELSE

IF условие

THEN действие

ELSE действие

TRUE

FALSE

Слайд 7

IF-THEN-ELSE (пример) Пример: DECLARE v_hiredate DATE := '12-Dec-1990'; v_five_years BOOLEAN; BEGIN

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 IF условие THEN действие TRUE FALSE THEN действие ELSIF условие ELSE действие TRUE FALSE

IF-THEN-ELSIF

IF условие

THEN действие

TRUE

FALSE

THEN действие

ELSIF условие

ELSE действие

TRUE

FALSE

Слайд 9

IF-THEN-ELSIF (пример) Пример: ... IF v_start > 100 THEN v_start :=

IF-THEN-ELSIF (пример)

Пример:
...
IF v_start > 100 THEN
v_start := 0.2 * v_start;
ELSIF

v_start >= 50 THEN
v_start := 0.5 * v_start;
ELSE
v_start := 0.1 * v_start;
END IF;
...
Слайд 10

Сравнение с NULL Обработка пустых значений (NULL) с использованием IS NULL

Сравнение с NULL
Обработка пустых значений (NULL) с использованием IS NULL ,

IS NOT NULL
Составление конкатенированных выражений используя NULL значения.
* нюансы… NULL
https://habrahabr.ru/post/127327/

Работа с NULL значениями

Оператор 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. Если в IF

Простые сравнения, имеющие NULL значения всегда возвращают NULL. Если в IF

используется сравнение с NULL, то и результат будет NULL.
Применение логического оператора NOT к пустым выражениям выдает NULL.

Обработка 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

Логические таблицы

Логические таблицы

Слайд 13

Условия с булевыми значениями Пример: v_flag := v_reorder_flag AND v_available_flag;

Условия с булевыми значениями

Пример:
v_flag := v_reorder_flag AND v_available_flag;

Слайд 14

Циклы повторяют инструкцию или последовательность операций в течении указанного количества раз.

Циклы повторяют инструкцию или последовательность операций в течении указанного количества раз.
В

PL/SQL существует три типа цикла:
Основной цикл (LOOP)
Цикл FOR
Цикл WHILE

Управление итерациями

Слайд 15

LOOP statement1; . . . EXIT [WHEN condition]; --условие выхода END

LOOP
statement1;
. . .
EXIT [WHEN condition]; --условие выхода
END LOOP;

LOOP

condition –

булево выражение или инструкция, возвращающее TRUE или FALSE
Слайд 16

DECLARE v_ordid item.ordid%TYPE := 601; v_counter NUMBER(2) := 1; BEGIN 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, ухучшается отладка и поддержка кода.

Пример LOOP

Слайд 17

WHILE condition LOOP statement1; statement2; . . . END LOOP; WHILE

WHILE condition LOOP
statement1;
statement2;
. . .
END LOOP;

WHILE

condition – условие выполнения для каждой

итерации, до тех пор пока верно выполняется цикл (принимает значения TRUE или FALSE)
Слайд 18

DECLARE v_counter NUMBER(3) := 1; BEGIN WHILE v_counter --EXIT; INSERT INTO

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;

WHILE (пример)

Слайд 19

lower – начальное значение итерации upper – конечное значение итерации counter

lower – начальное значение итерации
upper – конечное значение итерации
counter – счетчик

итераций, объявление не обязательно.

Цикл FOR

FOR counter IN [REVERSE] lower..upper
LOOP
statement1;
statement2;
. . .
END LOOP;

Слайд 20

Счетчик можно не объявлять в блоке DECLARE Ссылка на счётчик разрешается

Счетчик можно не объявлять в блоке DECLARE
Ссылка на счётчик разрешается только

в пределах цикла.
Для задания интервала может использоваться выражение.
Не следует присваивать счетчику значения

FOR - рекомендации

Слайд 21

DECLARE v_counter NUMBER(3) := 1; BEGIN FOR iasasd in 1 ..

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;

FOR (пример)

Слайд 22

Для циклов, которые необходимо выполнить хотя бы 1 раз - простой

Для циклов, которые необходимо выполнить хотя бы 1 раз - простой

LOOP
Используем WHILE если необходимо проверять условие перед каждой итерацией
Используем FOR если точно известно количество итераций

Рекомендации
по использованию циклов

Слайд 23

В PL/SQL существует возможность вкладывать циклы друг в друга. Для различия

В PL/SQL существует возможность вкладывать циклы друг в друга.
Для различия между

блоками и циклами используются метки.
В случае использования меток, выход из цикла осуществляется по меткам:
...
END LOOP my_label;

Вложенные циклы и метки

Слайд 24

DECLARE v_counter integer:=1; v_counter_i integer:=1; BEGIN > LOOP v_counter := v_counter

DECLARE
v_counter integer:=1;
v_counter_i integer:=1;
BEGIN
<>
LOOP
v_counter := v_counter +

1;
v_counter_i:=1;
<>
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

DECLARE BEGIN FOR iasasd in 1 .. 10 LOOP IF iasasd

DECLARE
BEGIN
FOR iasasd in 1 .. 10 LOOP
IF iasasd >3

and iasasd <=8 THEN
CONTINUE;
END IF;
INSERT INTO tmp(id, name)
VALUES(iasasd, 'TMP'||iasasd);
END LOOP;
END;
select * from TMP ;
1 TMP1
2 TMP2
3 TMP3
9 TMP9
10 TMP10

CONTINUE : переход к следующей итерации цикла

Слайд 26

Итоги Научились работать с операторами изменяющими логическую последовательность команд Условные операторы

Итоги

Научились работать с операторами изменяющими логическую последовательность команд
Условные операторы IF
Циклы
LOOP
FOR
WHILE
EXIT

Слайд 27

Практика №4! 40 минут

Практика №4!

40 минут

Слайд 28

Самостоятельное изучение: CASE Простые команды CASE CASE employee_type WHEN 'S' THEN

Самостоятельное изучение: CASE

Простые команды 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;

CASE в стандарте SQL с 1992 года, в с версии Oracle8, в PL/SQL — с Oracle9. Поддерживаются следующие разновидности команд CASE:
Простая команда CASE — связывает одну или несколько последовательностей ко-
манд PL/SQL с соответствующими значениями .
Поисковая команда CASE — выбирает для выполнения одну или несколько после-
довательностей команд в зависимости от результатов проверки списка логических
значений. Выполняется последовательность команд, связанная с первым условием,
результат проверки которого оказался равным TRUE.