Структура простого цикла лежит в основе всех остальных циклических конструкций. Такой цикл состоит из ключевого слова loop, исполняемого кода (тела цикла) н ключевых слов end loop:
LOOP
исполняемые_операторы
END LOOP;
Цикл начинается оператором loop, а заканчивается оператором end loop. Тело цикла должно содержать как минимум один исполняемый оператор. Свойства простого цикла описаны в следующей таблице.
Условие завершения цикла:
Если в теле цикла выполняется оператор EXIT. В противном случае он работает бесконечно
Когда проверяется условие завершения цикла:
При выполнении оператора EXIT или EXIT WHEN. Таким образом, тело цикла (или его часть) всегда выполняется как минимум один раз
В каких случаях используется данный цикл:
Во-первых, если не известно, сколько раз будет выполняться тело цикла, а во-вторых, когда необходимо, чтобы тело цикла было выполнено хотя бы один раз
Простой цикл завершается при выполнении в теле цикла оператора EXIT или его близкого родственника — оператора EXIT WHEN, а также в том случае, если в теле цикла инициируется исключение (которое остается необработанным).Данный цикл удобно использовать в ситуации, когда нужно гарантировать хотя бы однократное выполнение тела цикла (или его части).
Завершение простого цикла: операторы EXIT и EXIT WHEN
При использовании простых циклов нужна предельная внимательность. Убедитесь, что в коде задано условие, при котором выполнение цикла останавливается. Для этого в его теле должен содержаться оператор EXIT или EXIT WHEN. Синтаксис данных операторов таков;
EXIT
EXIT WHEN условие:
Здесь условие - это логическое выражение. Приведенный ниже пример показывает, как оператор EXIT останавливает выполнение цикла и передает управление оператору, следующему за ключевыми словами END LOOP. Функция account_balance возвращает остаток денег на счету с идентификатором account_id. Если на этом счету осталось меньше 1000 долларов, выполняется оператор EXIT и цикл завершается. В противном случае программа снимает с банковского счета клиента сумму, необходимую для оплаты заказов:
LOOP
balance_remaining := account_balаnсе (account_id):
IF balance remaining < 1000
THEN
EXIT;
ELSE
apply_balance (account_id, balance_reriaining);
END IF;
END LOOP
Следует отметить, что оператор EXIT можно использовать только в цикле LOOP.
PL/SQL для выхода из цикла предлагает еще один оператор, EXIT WHEN, предназначенный для завершения цикла при наличии определенного условия. Он сочетает в себе функции операторов IF…THEN и EXIT, Приведенный выше цикл оператор EXIT WHEN изменяет следующим образом:
LOOP
/* Вычисление баланса */
balance_remaining :-=account_balance (account_id);
/* Встраиваем условие в оператор EXIT */
EXIT WHEN balance_remaining < 1000;
/* Если цикл все еще выполняется, баланс уменьшается */
арр1у_Ьаlаnсе (account_id, balance_remaining);
END LOOP;
Как видите, для проверки условия завершения данного цикла оператор IF не нужен. Его задачу выполняет оператор ЕХIТ WHEN.
Так в каких же случаях следует использовать оператор EXIT WHEN, а в каких — просто EXIT?
- Оператор EXIT WHEN больше подходит для ситуаций, когда условие завершения цикла определяется одним выражением, как в приведенном выше примере.
- Если существует несколько условий завершения цикла, когда условия выхода из цикла разные, а также если должно быть определено возвращаемое значение, предпочтение следует отдать использованию оператора IF или CASE с оператором EXIT.
Давайте рассмотрим пример, когда предпочтительнее использовать оператор EXIT. Он взят из функции, определяющей, являются ли два файла эквивалентными (то есть содержащими одну и ту же информацию):
IF (end_of_filel AND end_of_file2) THEN
retval :=TRUE;
EXIT;
ELSIF (checkline != againstline) THEN
retval := FALSE:
EXIT;
ELSIF (end_of_filel OR end_of_file2) THEN
retval := FALSE:
EXIT;
END IF; END LOOP;
Эмуляция цикла REPEAT UNTIL
В PL/SQL отсутствует цикл REPEAT UNTIL, в котором условие проверяется после выполнения тела цикла, в результате чего последнее выполняется как минимум один раз. Однако этот цикл легко эмулировать с помощью следующего простого цикла:
LOOP
... тело цикла ...
EXIT WHEN логическое_условие;
END LOOP;
Здесь логическое_условие — это логическая переменная или выражение, результатом проверки которого является значение TRUE или FALSE.