Oracle PL/SQL LOOP с примером

Что такое петли?

Циклы позволяют определенной части кода программы выполняться желаемое количество раз.

В этом уроке мы рассмотрим концепцию цикла в PL/SQL и поток управления в циклах.

Введение в концепцию циклов

Концепция циклов обеспечивает следующее преимущество при кодировании.

  • Возможность повторного использования кода
  • Уменьшенный размер кода
  • Простота управления
  • Пониженная сложность

На диаграмме ниже в наглядной форме показана концепция цикла.

Oracle PL/SQL-цикл

На приведенной выше диаграмме будет проверяться условие цикла, и пока условие цикла выполняется, блок выполнения будет выполняться.

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

Заявления контроля цикла

Прежде чем изучать концепцию циклов, необходимо изучить операторы управления циклом. Операторы управления циклом — это операторы, которые фактически управляют потоком выполнения внутри цикла. Ниже приведено подробное описание операторов управления циклом.

ПРОДОЛЖИТЬ

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

ВЫХОД / ВЫХОД КОГДА

Это ключевое слово отправляет движку PL/SQL инструкцию, согласно которой всякий раз, когда движок PL/SQL встречает это ключевое слово, он немедленно выходит из текущего цикла. Если механизм PL/SQL встречает EXIT во вложенном цикле, то он выйдет из цикла, в котором он был определен, т. е. во вложенных циклах, команда EXIT во внутреннем цикле приведет только к выходу из управления из внутреннего цикла, но не из внешнего цикла. За EXIT WHEN следует выражение, которое дает логический результат. Если результат ИСТИНА, то элемент управления ВЫХОДИТ.

GOTO

Этот оператор передаст управление помеченному оператору («GOTO ;»). Это имеет следующие ограничения

  • Передача управления может осуществляться только внутри подпрограмм.
  • Передача управления не может быть выполнена из части обработки исключений в часть исполнения.

Использование этого оператора не рекомендуется, если нет других альтернатив, поскольку отслеживание управления кодом в программе будет очень затруднено из-за передачи управления от одной части к другой.

Типы циклов в PL/SQL

PL/SQL обеспечивает следующие три типа циклов

Базовый оператор цикла

Этот оператор цикла представляет собой простейшую структуру цикла в PL/SQL. Блок выполнения начинается с ключевого слова «LOOP» и заканчивается ключевым словом «END LOOP».

Условие выхода должно быть задано внутри этого блока выполнения, чтобы управление вышло из цикла.

Для выхода из цикла необходимо явно указать ключевое слово EXIT в части выполнения.

Базовый оператор цикла

 LOOP
<execution block starts>
<EXIT condition based on developer criteria> 
<execution_block_ends>
END LOOP;

Объяснение синтаксиса:

  • В приведенном выше синтаксисе ключевое слово «LOOP» отмечает начало цикла, а «END LOOP» — конец цикла.
  • Блок выполнения содержит весь код, который необходимо выполнить, включая условие EXIT.
  • Исполняющая часть может содержать любой оператор выполнения.

Примечание: Базовый оператор цикла без ключевого слова EXIT будет БЕСКОНЕЧНЫМ ЦИКЛОМ, который никогда не остановится.

Пример 1: В этом примере мы собираемся напечатать число от 1 до 5, используя базовый оператор цикла. Для этого мы выполним следующий код.

Базовый оператор цикла

DECLARE 
a NUMBER:=1; 
BEGIN
dbms_output.put_line('Program started.');
LOOP
dbms_output.put_line(a);
a:=a+1;
EXIT WHEN a>5;
END LOOP;
dbms_output.put_line('Program completed');
END:
/

Пояснение к коду:

  • Строка кода 2: объявление переменной «a» как типа данных «NUMBER» и инициализация ее значением «1».
  • Строка кода 4: Печать сообщения «Программа запущена».
  • Строка кода 5: Ключевое слово «LOOP» отмечает начало цикла.
  • Строка кода 6: Печатает значение «а».
  • Строка кода 7: Увеличивает значение «a» на +1.
  • Строка кода 8: Проверяет, превышает ли значение «a» 5.
  • Строка кода 9: Ключевое слово «END LOOP» отмечает конец блока выполнения.
  • Код со строк 6 по строку 8 будет продолжать выполняться до тех пор, пока «a» не достигнет значения 6, поскольку условие вернет TRUE, и элемент управления выйдет из цикла.
  • Строка кода 10: Печать заявления «Программа завершена»

Маркировка циклов

В PL/SQL циклы можно помечать. Метка должна быть заключена между «<<» и «>>». Маркировка циклов, особенно в кодах вложенных циклов, обеспечит большую читабельность. Метка может быть указана в команде EXIT для выхода из этого конкретного цикла. Используя метку, можно заставить элемент управления напрямую выйти из внешнего цикла вложенных циклов из любого места внутри циклов, указав команду выхода, за которой следует метка внешнего цикла.

Маркировка циклов

<<OUTER_LOOP>>
LOOP 
	<execution_block_starts>
	.
	<<INNER_LOOP>>
	LOOP --inner
		<execution_part>
	END LOOP;
	.
	<executi_block_ends>
END LOOP;

Объяснение синтаксиса:

  • В приведенном выше синтаксисе выходной цикл имеет внутри еще один цикл.
  • '< >' и '< >' — это метки этих циклов.

Пример 1: В этом примере мы собираемся напечатать число, начиная с 1, используя оператор базового цикла. Каждое число будет напечатано столько раз, сколько его значение. Верхний предел ряда фиксируется в части объявления программы. Давайте узнаем, как мы можем использовать концепцию этикетки для достижения этой цели. Для этого мы выполним следующий код

Маркировка цикловМаркировка циклов

DECLARE
a NUMBER:=0;
b NUMBER;
upper-limit NUMBER :=4;
BEGIN
dbms_output.put_line(‘Program started.' ); 
«outerloop»‭	‬
LOOP 
a:=a+1;
b:=l;
«inner loop»
LOOP
EXIT outer_loop WHEN a > upper_limit;
dbms_output.put_line(a);
b:=b+l;
EXIT inner_loop WHEN b>a;
END LOOP;
END LOOP;
dbms_output.put_line('Program completed.');
END;
/

Пояснение к коду:

  • Строка кода 2–3: объявление переменных «a» и «b» как типа данных «NUMBER».
  • Строка кода 4: объявление переменной «upper_limit» как типа данных «NUMBER» со значением «4».
  • Строка кода 6: Печать сообщения «Программа запущена».
  • Строка кода 7: Внешний цикл был помечен как «outer_loop».
  • Строка кода 9: Значение «a» увеличивается на 1.
  • Строка кода 11: Внутренний цикл помечен как «inner_loop».
  • Строка кода 13: Условие EXIT, которое проверяет, превышает ли значение «a» значение «upper_limit». Если нет, то он пойдет дальше, иначе он выйдет из внешнего цикла напрямую.
  • Строка кода 14: Печать значения «b».
  • Строка кода 15: Увеличивает значение «b» на +1.
  • Строка кода 16: Условие EXIT, которое проверяет, превышает ли значение «b» значение «a». Если да, то он выйдет из управления из внутреннего цикла.
  • Строка кода 14: Печать заявления «Программа завершена»

Резюме

Петля Базовый цикл
Критерии ВЫХОДА Выход при обнаружении ключевого слова EXIT в части выполнения.
Применение Хорошо использовать, когда выход не основан на каком-либо конкретном условии.