Использование счетчика в цикле FOR

В 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. Но какой бы подход вы ни избрали, обязательно подробно его закоментируйте. Комен­тарии помогут другим программистам при сопровождении вашей программы.