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