УПРАВЛЕНИЕ ПОТОКОМ В БЛОКАХ PL/SQL
Управление потоком операций в PL/SQL Логический поток операций можно изменять с помощью управляющих структур: Структуры условного управления (оператор IF) Циклы - простой цикл - цикл FOR - цикл WHILE - оператор EXIT
Оператор IF IF condition THEN statements; [ELSIF condition THEN statements;] [ELSE statements;] END IF; IF condition THEN statements; [ELSIF condition THEN statements;] [ELSE statements;] END IF; ELSIF – одно словоELSIF – одно слово END IF – два словаEND IF – два слова Предложение ELSE может быть только одноПредложение ELSE может быть только одно Действия можно выполнять выборочнов зависимости от определенных условий:
Оператор IF. Примеры... IF V_last_name =Dumas THEN v_job:=Sales Representative; v_region_id:=35; END IF; IF V_last_name =Dumas THEN v_job:=Sales Representative; v_region_id:=35; END IF; IF v_date_shipped – v_date_ordered
Оператор IF-THEN-ELSIF: пример... IF v_start > 100 THEN RETURN (2 * v_start); ELSIF v_start>=50 THEN RETURN (.5 * v_start); ELSE RETURN (.0 * v_start); END IF;... IF v_start > 100 THEN RETURN (2 * v_start); ELSIF v_start>=50 THEN RETURN (.5 * v_start); ELSE RETURN (.0 * v_start); END IF;... Вычисление одного значения на основе другого.
Задание логических условий Неопределенные значения можно обрабатывать с помощью оператора IS NULL Выражение, содержащее неопределенные значения, дает результат NULL Результатом конкатенации выражения с неопределенным значением является пустая строка
Таблицы истинности Построение простого логического условия с оператором сравнения AND TRUE FALSENULL TRUE FALSENULL FALSE NULL FALSENULL OR TRUE FALSENULL TRUE FALSETRUEFALSENULL TRUENULL NOT TRUEFALSE TRUE NULL
Логические условия V_flag:=v_reorder_flag AND v_anailable_flag V_reorder_flagV_anailable_flagVALUE TRUE NULL TRUE FALSE TRYE FALSE Каково значение v_falg в каждом случае?
Циклы Цикл позволяет выполнить последовательность предложений несколько раз Три типа циклов: - простой цикл - цикл FOR - цикл WHILE
Простой цикл: синтаксис LOOP -- ограничитель statement1;-- оператор … EXIT [WHEN condition]; --оператор EXIT END LOOP;-- ограничитель LOOP -- ограничитель statement1;-- оператор … EXIT [WHEN condition]; --оператор EXIT END LOOP;-- ограничитель Без предложения EXIT цикл был бы бесконечным Многократное выполнение команд с помощью простого цикла
Простой цикл: пример... v_ord_id s_item.ord_id%TYPE:=101; v_counter NUMBER(2):=1; BEGIN... LOOP INSERT INTO s_item (ord_id, item_id) VALUES (v_ord_id, v_counter); v_counter:= v_counter+1; EXIT WHEN v_counter>10; END LOOP;... v_ord_id s_item.ord_id%TYPE:=101; v_counter NUMBER(2):=1; BEGIN... LOOP INSERT INTO s_item (ord_id, item_id) VALUES (v_ord_id, v_counter); v_counter:= v_counter+1; EXIT WHEN v_counter>10; END LOOP;... Включение первых десяти товарных позиций в заказ номер 101.
Цикл FOR: синтаксис FOR индекс in [REVERSE] нижняя_граница..верхняя_граница LOOP предложение1; предложение2;... END LOOP; FOR индекс in [REVERSE] нижняя_граница..верхняя_граница LOOP предложение1; предложение2;... END LOOP; Объявление индекса (переменной цикла) не требуется; индекс описывается неявно. Цикл FOR – это быстый способ проверки количества повтора цикла.
Цикл FOR: пример Пример Вывод количества выполнений цикла и последнего значения индекса. Указания Ссылаться на индекс можно только внутри цикла ; вне цикла он не определен. Для ссылки на текущее значение индекса можно использовать выражение. Нельзя ссылаться на индекс в качестве переменной в левой части оператора присваивания.
Цикл WHILE: синтаксис WHILE condition LOOP -- Условие оценивается statement1; -- в начале каждой statement2; -- итерации... END LOOP; WHILE condition LOOP -- Условие оценивается statement1; -- в начале каждой statement2; -- итерации... END LOOP; Цикл WHILE используется для повторения цикла в течение всего времени, пока выполняется условие.
Цикл WHILE: пример... v_ord_id s_item.ord_id%TYPE:=101; v_counter NUMBER(2):=1; BEGIN... WHILE v_counter
Вложенные циклы и метки Возможно несколько уровней вложенных циклов Для различения циклов и блоков используются метки Выход из внешнего цикла осуществляется с помощью оператора EXIT, содержащего ссылку на метку
Вложенные циклы и метки: пример... BEGIN > LOOP v_counter:=v_counter+1; EXIT WHEN v_counter > 10; > LOOP... EXIT Outer_loop WHEN total_done = Yes; -- Leave both loop EXIT WHEN inner_done = Yes; -- Leave inner loop only... END LOOP Inner_loop;... END LOOP Outer_loop; END;... BEGIN > LOOP v_counter:=v_counter+1; EXIT WHEN v_counter > 10; > LOOP... EXIT Outer_loop WHEN total_done = Yes; -- Leave both loop EXIT WHEN inner_done = Yes; -- Leave inner loop only... END LOOP Inner_loop;... END LOOP Outer_loop; END; Выход из внешнего цикла по значениям, вычисленным во внутреннем блоке
Практическое занятие 1.Создайте процедуру SET_COMM, которая устанавливает процент комиссионных для служащего в зависимости от общего объема продаж а) Для подготовке к упражнению отмените действие ограничения для столбца COMISSION_PCT в таблице S_EMP. Проценты комиссионных в упражнении не будут удовлетворять ограничению. > ALTER TABLE s_emp +> DROP CONSTRAINT s_emp_comission_pct_ck; > ALTER TABLE s_emp +> DROP CONSTRAINT s_emp_comission_pct_ck; б) Создайте параметр, чтобы можно было ввести номер служащего. в) Подсчитайте сумму всех заказов, размещенным этим служащим. г) Если эта сумма меньше установите процент комиссионных «10». д) Если сумма находится в диапазоне от до , установите процент комиссионных «15». е) Если в таблице S_ORD нет заказов, размещенных данным служащим, установите процент комиссионных «0».
Практическое занятие 2. Создайте процедуру CUST_UPDATE с циклом для обработки кредитного рейтинга всех заказчиков по регионам. Не фиксируйте изменения а) Если номер региона четный, установите кредитный рейтинг Exellent, даже если он уже был таким; в противном случае установите кредитный рейтинг Good. б) Когда строки будут обновлены, определите количество обновленных строк. В зависимости от того, каким будет это количество, выдайте на экран следующую информацию: Если обновлено менее трех срок, сообщение : Fewer then 3 customer records updated for region number X, где X – номер региона. В противном случае – Y rows updated for region number X, где Y – количество обновленных строк, X – номер региона. в) Отмените изменения. Задайте точку останова на проверке количества обновленных строк.
Практическое занятие 3. Создайте процедуру EMP_MESSAGE, которая выбирает фамилию служащего, дату начала работы и заработную плату по номеру служащего, задаваемому во времени выполнения. Выдайте на экран сообщение по любой комбинации нижеуказанных критериев (используйте вложенные операторы IF) КритерийСообщение Зарплата более 1200 Salary >1200 Фамилия содержит RName contains R Дата начала работы приходится на март March start date Ничего из вышеуказанного**None**