В PL/SQL существует два вида цикла FOR: с числовым счетчиком и с курсором. Цикл с числовым счетчиком — это традиционный и хорошо знакомый всем программистам цикл FOR, имеющийся в большинстве языков программирования. Количество итераций данного цикла известно еще до его начала — это диапазон, задаваемый между ключевыми словами FOR и LOOP. При установке диапазона значений счетчика цикла неявно объявляется сам счетчик (если он не был объявлен ранее), определяются начальное и конечное значения диапазона, а также задается направление изменена значений счетчика (от наименьшего к наибольшему или наоборот).
Приведем общий синтаксис цикла FOR:
FOR индекс_цикла IN [REVERSE]
начальное_значение .. конечное_значение LOOP
исполняемые_операторы END LOOP;
Между ключевыми словами LOOP и END LOOP должен стоять хотя бы один исполняемый оператор. Свойства цикла FOR с числовым счетчиком приведены в следующей таблице.
Условие завершения:
Если выполнено то количество итераций, которое определено диапазоном значений счетчика. (Можно завершить цикл и оператором EXIT, но это делать не рекомендуется)
Когда проверяется условие завершения цикла:
После каждого выполнения тела цикла компилятор проверяет условие завершения значение счетчика цикла, если оно находится вне заданного диапазона, цикла выполнение цикла прекращается. В том случае, когда начальноe значение больше конечного, тело цикла не выполняется
В каких случаях используется данный цикл:
Если тело цикла должно быть выполнено определенное количество раз
Правила для циклов FOR с числовым счетчиком
При использовании цикла FOR с числовым счетчиком необходимо следовать таким правилам.
- Не объявляйте счетчик цикла. По умолчанию он будет неявно объявлен как локальная переменная, имеющая тип данных INTEGER, Областью действия указанной переменной будет весь цикл; на счетчик цикла нельзя ссылаться извне
- Выражения, используемые при определении диапазона счетчика цикла (начального и конечного значений) вычисляются один раз. В ходе выполнения цикла они не пересчитываются. Поэтому если внутри цикла вы измените значения переменных, которые используются при определении диапазона счетчика, его граничные значения останутся прежними.
- Никогда ие меняйте значения счетчика цикла и границ диапазона внутри цикла. Это порочная практика. Компилятор PL/SQL либо выдаст сообщение об ошибке, либо проигнорирует ваши действия – в любом случае у вас возникнут проблемы.
- Если вы хотите, чтобы зиачения счетчика уменьшались в направлении от конечного к начальному, используйте ключевое слово REVERSE. При этом первое значение в определении диапазона (ндчальное_значение) должно быть меньше второго {конечное_значение). Но не меняйте порядок следования этих значений – ключевое слово REVERSE само сделает все, что нужно.
Примеры циклов FOR с числовым счетчиком
Далее будут рассмотрены примеры, демонстрирующие некоторые варианты синтаксиса цикла FOR с числовым счетчиком.
- Цикл выполняется 10 раз; значение счетчика увеличивается от 1 до 10:
FOR loop_counter IN 1 .. 10 LOOP
... исполняемые операторы ...
END LOOP;
- Цикл выполняется 10 раз; значение счетчика уменьшается от 10 до 1:
FOR loop_comter IN REVERSE 1 .. 10 LOOP
... исполняемые операторы ...
END LOOP:
- Цикл не выполняется ни разу. Используется ключевое слово REVERSE, так что значение счетчика цикла, loop_counter, изменяется от наибольшего до наименьшего. Однако начальное и конечное значения счетчика заданы неверно:
FOR loop_counter IN REVERSE 10 ... 1 LOOP
/* Это тело цикла не выполнится ни разу! */
END LOOP:
Даже если вы зададите направление с помощью ключевого слова REVERSE, начальное значение диапазона счетчика все равно должно быть указано первым. Если начальное значение больше конечного, тело цикла ни разу не будет выполнено. Если же граничные значения будут одинаковыми, тело цикла будет выполнено один раз.
- Цикл выполняется для диапазона, определяемого значениями переменной и выражения:
FOR calc_index IN start_period_number
LEAST (end_period_number, current period)
LOOP
... исполняемые операторы . . .
END LOOP;
В этом примере количество итераций цикла определяется во время выполнения программы. Начальное и конечное значения вычисляются один раз, перед началом цикла, и затем используются в течение всего времени его выполнения.
Обработка нетривиальных приращений
PL/SQL не предоставляет специальных синтаксических способов задания шага приращения счетчика. Во всех разновидностях цикла FOR с числовым счетчиком значение счетчика на каждой итерации увеличивается на единицу.
В том случае, когда приращение должно быть нестандартным (не равным единице), придется писать специальный код. Например, что нужно сделать для того, чтобы тело цикла выполнялось только для четных чисел из диапазона от 1 до 100? Во-первых, можно использовать числовую функцию MOD, как в следующем примере:
FOR loop index IN 1 .. 100 LOOP
IF MOD (loop_ndex, Z) = 0 THEN
/* Число четное, поэтому выполним вычисления */
cal c_values( loop_index);
END IF;
END LOOP;
Во-вторых, в теле цикла значение счетчика можно умножить на два и использовать вдвое меньший диапазон:
FOR even_number IN 1 .. 50 LOOP
calc_values(even_number*2);
END LOOP:
В обоих случаях процедура calc_values выпотлняется только для четных чисел. В первом примере цикл FOR повторяется 100 раз, во втором – только 50. Но какой бы подход вы ни избрали, обязательно подробно его закоментируйте. Коментарии помогут другим программистам при сопровождении вашей программы.