Возможность использования циклов разных видов позволяет выбрать оптимальный способ решения каждой конкретной задачи. В большинстве случаев решить задачу можно с помощью любого цикла но если воспользоваться самым подходящим из них, код будет более коротким и простым.
Примеры разных циклов
Чтобы вы сразу получили некоторое представление о каждом из циклов и о том, как они работают, рассмотрим три процедуры. Каждая из них содержит цикл, в теле которого выполняется одна и та же строка кода (процедура 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;
В общем случае цикл можно представить себе как процедуру или функцию. Его тело – «черный ящик», а условие завершения – это интерфейс такого ящика. Код, находящийся вне цикла, ничего не должен знать о его внутренней работе. Именно так можно рассматривать примеры разных циклов, которые приведены в этой главе.