Простой цикл

Структура простого цикла лежит в основе всех остальных циклических конст­рукций. Такой цикл состоит из ключевого слова 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.