Погружение в базы данных Oracle

Данная книга является руководством для начинающих специалистов в области анализа и обработки данных. В книге рассматривается язык SQL и его процедурное расширение PL/SQL от компании Oracle.

Купить книгу

SQL без слёз

Цель книги заключается в том, чтобы научить любого человека работать с реляционными базами данных и получать из них необходимую информацию посредством выполнения SQL-запросов.

Скачать книгу

 ›  ›  ›  › Цикл FOR со счётчиком в PL/SQL Oracle

Цикл FOR со счётчиком в PL/SQL Oracle

Цикл FOR со счетчиком — это традиционный, хорошо знакомый всем программистам цикл FOR, поддерживаемый в большинстве языков программирования. Количество итераций этого цикла известно еще до его начала; оно задается в диапазоне между ключевыми словами FOR и LOOP.

Диапазон неявно объявляет управляющую переменную цикла (если она не была явно объявлена ранее), определяет начальное и конечное значения диапазона, а также задает направление изменения счетчика (по возрастанию или по убыванию).

Синтаксис цикла FOR

FOR счетчик IN [REVERSE] начальное_значение .. конечное_значение
LOOP
   исполняемые_команды
END LOOP;

Между ключевыми словами LOOP и END LOOP должна стоять хотя бы одна исполняемая команда.

Основные свойства цикла FOR с числовым счетчиком

Свойство Описание
Условие завершения цикла Числовой цикл FOR безусловно завершается при выполнении количества итераций, определенного диапазоном значений счетчика. (Цикл может завершаться и командой EXIT, но делать этого не рекомендуется)
Когда проверяется условие завершения цикла После каждого выполнения тела цикла компилятор PL/SQL проверяет значение счетчика. Если оно выходит за пределы заданного диапазона, выполнение цикла прекращается. Если начальное значение больше конечного, то тело цикла не выполняется ни разу
В каких случаях используется данный цикл Если тело цикла должно быть выполнено определенное количество раз, а выполнение не должно прерываться преждевременно

Правила для циклов FOR с числовым счетчиком

При использовании цикла FOR с числовым счетчиком необходимо следовать некоторым правилам:

  • Не объявляйте счетчик цикла. PL/SQL автоматически неявно объявляет локальную переменную с типом данных INTEGER. Область действия этой переменной совпадает с границей цикла; обращаться к счетчику за пределами цикла нельзя.
  • Выражения, используемые при определении диапазона (начального и конечного значений), вычисляются один раз. Они не пересчитываются в ходе выполнения цикла. Если изменить внутри цикла переменные, используемые для определения диапазона значений счетчика, его границы останутся прежними.
  • Никогда не меняйте значения счетчика и границ диапазона внутри цикла. Это в высшей степени порочная практика. Компилятор PL/SQL либо выдаст сообщение об ошибке, либо проигнорирует изменения — в любом случае возникнут проблемы.
  • Чтобы значения счетчика уменьшались в направлении от конечного к начальному, используйте ключевое слово REVERSE. При этом первое значение в определении диапазона (начальное_значение) должно быть меньше второго (конечное_значение). Не меняйте порядок следования значений — просто поставьте ключевое слово REVERSE.

Примеры циклов FOR с числовым счетчиком

Следующие примеры демонстрируют некоторые варианты синтаксиса циклов FOR с числовым счетчиком.

Цикл выполняется 10 раз, счетчик увеличивается от 1 до 10:

FOR loop_counter IN 1 .. 10
    LOOP
       ... исполняемые_команды ...
    END LOOP;

Цикл выполняется 10 раз, счетчик уменьшается от 10 до 1:

 FOR loop_counter 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_index, 2) = 0
   THEN
      /* Число четное, поэтому вычисления выполняются */
      calc_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.

Метки: , , .

Записи по теме

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *