Цикл WHILE в PL/SQL Oracle
Условный цикл WHILE выполняется до тех пор, пока определенное в цикле условие остается равным TRUE. А поскольку возможность выполнения цикла зависит от условия и не ограничивается фиксированным количеством повторений, он используется именно в тех случаях, когда количество повторений цикла заранее не известно.
Синтаксис цикла WHILE
WHILE условие LOOP исполняемые_команды END LOOP;
Здесь условие — логическая переменная или выражение, результатом проверки которого является логическое значение TRUE, FALSE или NULL. Условие проверяется при каждой итерации цикла. Если результат оказывается равным TRUE, тело цикла выполняется. Если же результат равен FALSE или NULL, то цикл завершается, а управление передается исполняемой команде, следующей за командой END LOOP.
Свойства цикла WHILE
Свойство | Описание |
Условие завершения цикла | Если значением логического выражения цикла является FALSE или NULL |
Когда проверяется условие завершения цикла | Перед первым и каждым последующим выполнением тела цикла. Таким образом, не гарантируется даже однократное выполнение тела цикла WHILE |
В каких случаях используется данный цикл | (1) Если не известно, сколько раз будет выполняться тело цикла; (2) возможность выполнения цикла должна определяться условием; (3) тело цикла может не выполняться ни одного раза |
Условие WHILE проверяется в начале цикла и в начале каждой его итерации, перед выполнением тела цикла. Такого рода проверка имеет два важных последствия:
- Вся информация, необходимая для вычисления условия, должна задаваться перед первым выполнением цикла.
- Может оказаться, что цикл WHILE не будет выполнен ни одного раза.
В следующем примере цикла WHILE используется условие, представленное сложным логическим выражением. Прерывание цикла WHILE вызвано одной из двух причин: либо завершением списка масок даты, которые применяются для выполнения преобразования, либо успешным завершением преобразования (и теперь переменная date_converted содержит значение TRUE):
WHILE mask_index <= mask_count AND NOT date_converted LOOP BEGIN /* Попытка преобразования строки по маске в записи таблицы */ retval := TO_DATE (value_in, fmts (mask_index)); date_converted := TRUE; EXCEPTION WHEN OTHERS THEN mask_index:= mask_index+ 1; END; END LOOP;