Основы циклов

Возможность использования циклов разных видов позволяет выбрать оптималь­ный способ решения каждой конкретной задачи. В большинстве случаев решить задачу можно с помощью любого цикла но если воспользоваться самым подходя­щим из них, код будет более коротким и простым.

Примеры разных циклов

Чтобы вы сразу получили некоторое представление о каждом из циклов и о том, как они работают, рассмотрим три процедуры. Каждая из них содержит цикл, в теле которого выполняется одна и та же строка кода (процедура set_rank, уста­навливающая категорию с заданным номером): set_rank(ranking_level);

  • Простой цикл. Процедура принимает в качестве аргумента максимальный но­мер категории и устанавливает категории, начиная с первого номера и закан­чивая самым большим. Заметьте, что от бесконечного выполнения цикла нас предохраняет оператор EXIT WHEN, обеспечивающий его завершение:
PROCEDURE set_all_ranks (max_rank_in IN INTEGER) IS
ranking_level NUMBER (3) :=1;
BEGIN LOOP
EXIT WHEN ranking_level > max_rank_in;
set_rank (ranking_level):;
ranking_level  := ranking_level + 1;
END LOOP:
END set_all_ranks;
  • Цикл FOR. В этом случае устанавливается категория из фиксированного диа­пазона, от 1 до максимального значения:
PROCEDURE set_all_ranks (max rank_in IN INTEGER) IS
ranking_level NUMBER (3) := 1 BEGIN
FOR ranking_level IN 1 .. max_rank_in LOOP
set_rank (ranking_level);
END LOOP;
END set_all_ranks:
  • Цикл WHILE. Процедура принимает в качестве аргумента максимальный но­мер категории и устанавливает категории, начиная с первого номера и закан­чивая максимальны.м значением, Обратите внимание на то, что условие завер­шения цикла задано в одной строке с ключевым словом WHILE:

PROCEDURE set_all_ranks (max_rank_in IN INTEGER) IS

rankingjevel NUMBERO) := 1;

BEGIN
WHILE ranking_level <= max_rank_in LOOP
set_rank (rankingjevel);
ranking_level:= rranking_level + 1;
END LOOP;
END set_all_ranks:

В приведенном выше примере самым маленьким получился цикл FOR, Однако его можно использовать только потому, что заранее известно, сколько раз (max_rank_in) должно выполняться тело цикла. Во многих других случаях количество повторений может быть различным, и поэтому для них цикл FOR не подходит.

Структура циклов PL/SQL

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

WHILE need_more_data LOOP
read_next_record (trecord_id);
need_more_data :=''record_id IS NOT NULL',
END LOOP;

В общем случае цикл можно представить себе как процедуру или функцию. Его тело — «черный ящик», а условие завершения — это интерфейс такого ящика. Код, находящийся вне цикла, ничего не должен знать о его внутренней работе. Именно так можно рассматривать примеры разных циклов, которые приведены в этой главе.