Синтаксис циклов pl sql

Синтаксис циклов pl sql thumbnail

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

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

Оператор цикла позволяет нам выполнять оператор или группу операторов несколько раз, и в большинстве языков программирования ниже приводится общая форма инструкции цикла.

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

S.NoТип и описание петли
1PL / SQL Basic LOOP

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

2PL / SQL WHILE LOOP

Повторяет оператор или группу операторов, пока данное условие выполняется. Он проверяет условие перед выполнением тела цикла.

3PL / SQL FOR LOOP

Выполнить последовательность операторов несколько раз и сократить код, который управляет переменной цикла.

4Вложенные циклы в PL / SQL

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

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

Повторяет оператор или группу операторов, пока данное условие выполняется. Он проверяет условие перед выполнением тела цикла.

Выполнить последовательность операторов несколько раз и сократить код, который управляет переменной цикла.

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

Маркировка цикла PL / SQL

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

Следующая программа иллюстрирует концепцию –

DECLARE i number(1); j number(1); BEGIN << outer_loop >> FOR i IN 1..3 LOOP << inner_loop >> FOR j IN 1..3 LOOP dbms_output.put_line(‘i is: ‘|| i || ‘ and j is: ‘ || j); END loop inner_loop; END loop outer_loop; END; /

Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат –

i is: 1 and j is: 1 i is: 1 and j is: 2 i is: 1 and j is: 3 i is: 2 and j is: 1 i is: 2 and j is: 2 i is: 2 and j is: 3 i is: 3 and j is: 1 i is: 3 and j is: 2 i is: 3 and j is: 3 PL/SQL procedure successfully completed.

Операторы управления циклом

Операторы управления циклом изменяют выполнение от его нормальной последовательности. Когда выполнение покидает область действия, все автоматические объекты, созданные в этой области, уничтожаются.

PL / SQL поддерживает следующие операторы управления. Маркировка петель также помогает вывести контроль за пределы петли. Нажмите на следующие ссылки, чтобы проверить их детали.

Оператор Exit завершает цикл, и управление передается оператору сразу после END LOOP.

Заставляет петлю пропускать оставшуюся часть своего тела и немедленно проверять свое состояние перед повторением.

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

Источник

На сегодня вы уже многое знаете о PL/SQL. Но очень многое еще впереди. Как и во всех языках программирования, в PL/SQL имеются операторы циклов. Их три основных типа:

  1. Безусловные циклы (выполняемые бесконечно)
  2. Интерактивные циклы (FOR)
  3. Условные циклы (WHILE)

Самый простой тип цикла в языке PL/SQL таков:

LOOP NULL; END LOOP /

Но использовать такой цикл нет смысла, да и для экземпляра БД это не безопасно. Для этого необходимо использовать определенные пути выхода из циклов. Их то же три:

  1. EXIT – Безусловный выход из цикла. Используется посредством применения оператора IF.
  2. EXIT WHEN – Выход при выполнении условия.
  3. GOTO – Выход из цикла во внешний контекст.

Давайте рассмотрим пример с применением цикла LOOP EXIT WHEN. Запишем следующее:

DECLARE i NUMBER := 0; BEGIN LOOP — start loop 1 i := i + 1; IF (i >= 100) THEN i := 0; EXIT; — exit when i >= 0 END IF; END LOOP; — end loop 1 LOOP — start loop 2 i := i + 1; EXIT WHEN (i >= 100); — exit when i >= 0 END LOOP; — end loop 2——– END; /

Получаем после исполнения:

SQL> DECLARE 2 i NUMBER := 0; 3 4 BEGIN 5 6 LOOP 7 i := i + 1; 8 IF (i >= 100) THEN 9 i := 0; 10 EXIT; 11 END IF; 12 END LOOP; 13 14 LOOP 15 i := i + 1; 16 EXIT WHEN (i >= 100); 17 END LOOP; 18 19 END; 20 / Процедура PL/SQL успешно завершена.

Видимых действий не было, но и ошибок то же! Первый цикл закончился после того как i стало равно 10. При этом оно получило значение 0 и произошел выход из цикла. Второй цикл применил вложенное предложение EXIT WHEN, что является более верным его использованием синтаксически. Тем не менее, применение условных операторов предполагает перед выходом из цикла проделать некоторые действия. Цикл LOOP EXIT WHEN END LOOP в последующем будет самым, часто используемым при построении конструкций курсоров. Рассмотрим еще одну разновидность вышеприведенного цикла:

DECLARE k NUMBER := 0; BEGIN WHILE (k < 10) LOOP k := k + 1; END LOOP; END; /

Получаем:

SQL> DECLARE 2 k NUMBER := 0; 3 4 BEGIN 5 6 WHILE (k < 10) LOOP 7 k := k + 1; 8 END LOOP; 9 10 END; 11 / Процедура PL/SQL успешно завершена.

Здесь в отличие от предыдущего цикла, действия выполняются до тех пор пока условие истинно. Если условие ложно, то цикл прекращается. Что хорошо видно из приведенного примера. В PL/SQL в конструкциях циклов нет такого, иногда полезного, оператора как CONTINUE, вследствие того, что выражение CONTINUE зарезервировано языком PL/SQL и используется для других целей. Но такую конструкцию как CONTINUE можно эмулировать, применив цикл вида LOOP EXIT WHEN END LOOP и используя весьма не популярный, но в данном случае очень полезный оператор GOTO!

Читайте также:  Сонатно симфонический цикл термин

Запишем следующее, выведем все нечетные числа до 20:

SET SERVEROUTPUT ON DECLARE s NUMBER := 0; BEGIN DBMS_OUTPUT.enable; LOOP IF(MOD(s, 2) = 1) THEN GOTO LESS; END IF; DBMS_OUTPUT.put_line(TO_CHAR(s)||’ is even!’); <<LESS>> EXIT WHEN (s = 20); s := s + 1; END LOOP; END; /

Получаем:

SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 s NUMBER := 0; 3 4 BEGIN 5 6 DBMS_OUTPUT.enable; 7 8 LOOP 9 IF(MOD(s, 2) = 1) THEN 10 GOTO LESS; 11 END IF; 12 DBMS_OUTPUT.put_line(TO_CHAR(s)||’ is even!’); 13 <<LESS>> 14 EXIT WHEN (s = 20); 15 s := s + 1; 16 END LOOP; 17 18 END; 19 / 0 is even! 2 is even! 4 is even! 6 is even! 8 is even! 10 is even! 12 is even! 14 is even! 16 is even! 18 is even! 20 is even! 0 is even! 2 is even! 4 is even! 6 is even! 8 is even! 10 is even! 12 is even! 14 is even! 16 is even! 18 is even! 20 is even! Процедура PL/SQL успешно завершена.

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

BEGIN FOR i IN 1..100 LOOP NULL; END LOOP; END; / SQL> BEGIN 2 FOR i IN 1..100 LOOP 3 NULL; 4 END LOOP; 5 END; 6 / Процедура PL/SQL успешно завершена.

В данный момент FOR успешно ничего не делал аж сто раз! Итак, давайте рассмотрим его чуть ближе, IN как и в операторе SELECT задает диапазон значений итерации цикла, а “..” это как вы помните так называемый “оператор диапазона”! Вот так просто и ясно. Остальное уже знакомо. Замечу так же, что переменная цикла i является переменной только для чтения. По этому шаг цикла FOR изменить принудительно нельзя! Если это необходимо, то лучше применять цикл вида LOOP EXIT WHEN END LOOP! 🙂 Теперь давайте поработаем с числами:

DECLARE s NUMBER := 0; BEGIN DBMS_OUTPUT.enable; FOR i IN 1..20 LOOP IF(MOD(i, 2) = 1) THEN DBMS_OUTPUT.put_line(TO_CHAR(i)||’ is even!’); s := i; END IF; END LOOP; DBMS_OUTPUT.put_line(‘last odd number was ‘||TO_CHAR(s)); END; /

Получаем:

SQL> DECLARE 2 s NUMBER := 0; 3 4 BEGIN 5 DBMS_OUTPUT.enable; 6 FOR i IN 1..20 LOOP 7 IF(MOD(i, 2) = 1) THEN 8 DBMS_OUTPUT.put_line(TO_CHAR(i)||’ is even!’); 9 s := i; 10 END IF; 11 END LOOP; 12 DBMS_OUTPUT.put_line(‘last odd number was ‘||TO_CHAR(s)); 13 END; 14 / 1 is even! 3 is even! 5 is even! 7 is even! 9 is even! 11 is even! 13 is even! 15 is even! 17 is even! 19 is even! last odd number was 19 Процедура PL/SQL успешно завершена.

Та же задачка, только с циклом FOR. Да, функция MOD возвращает остаток от деления чисел, как вы, наверное, уже догадались. Так же в операторе FOR есть возможность задавать обратный отсчет, ну, например, перед стартом или взрывом! 🙂 Вот так:

BEGIN DBMS_OUTPUT.enable; FOR i IN REVERSE 1..10 LOOP DBMS_OUTPUT.put_line(TO_CHAR(i)||’-‘); END LOOP; DBMS_OUTPUT.put_line(‘Blastoff!’); END; /

Получаем:

SQL> BEGIN 2 DBMS_OUTPUT.enable; 3 FOR i IN REVERSE 1..10 LOOP 4 DBMS_OUTPUT.put_line(TO_CHAR(i)||’-‘); 5 END LOOP; 6 DBMS_OUTPUT.put_line(‘Blastoff!’); 7 END; 8 / 10- 9- 8- 7- 6- 5- 4- 3- 2- 1- Blastoff! Процедура PL/SQL успешно завершена.

Нолика не было, но бабахнуло! Вот такой достаточно богатый набор операторов циклов в языке PL/SQL! Надеюсь, вы научитесь с легкостью их применять при построении серверных приложений ваших БД! 🙂

Источник

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

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

В этом уроке мы увидим концепцию цикла в PL / SQL и поток управления в циклах. Ты выучишь-

  • Введение в концепцию Loops
  • Loop Control Заявления
  • Типы циклов в PL / SQL
  • Базовое утверждение цикла
  • Маркировка петель

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

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

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

Диаграмма ниже показывает концепцию зацикливания в графической форме

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

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

Loop Control Заявления

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

ПРОДОЛЖИТЬ

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

EXIT / EXIT WHEN

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

ПЕРЕЙТИ К

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

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

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

Типы циклов в 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: увеличивает значение «а» на +1.
  • Строка кода 8: проверяет, больше ли значение «а», чем 5.
  • Строка кода 9: Ключевое слово «END LOOP» отмечает конец блока выполнения.
  • Код из строки 6 в строку 8 будет продолжать выполняться до тех пор, пока «а» не достигнет значения 6, так как условие вернет ИСТИНА и элемент управления выйдет из цикла.
  • Строка кода 10: печать заявления «Программа выполнена»

Маркировка петель

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

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

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

  • В приведенном выше синтаксисе цикл out имеет еще один цикл.
  • «<< OUTER_LOOP >>» и «<< INNER_LOOP >>» являются метками этих циклов.

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

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: внешний цикл был помечен как «external_loop»
  • Строка кода 9: значение «а» увеличивается на 1.
  • Строка кода 11: Внутренний цикл был помечен как «inner_loop».
  • Строка кода 13: условие ВЫХОДА, которое проверяет, больше ли значение «a», чем значение «upper_limit». Если нет, то он пойдет дальше, иначе он напрямую выйдет из внешнего цикла.
  • Строка кода 14: печать значения «b».
  • Строка кода 15: увеличивает значение «b» на +1.
  • Строка кода 16: условие EXIT, которое проверяет, больше ли значение «b», чем «a». Если это так, то он выйдет из управления из внутреннего цикла.
  • Строка кода 14: печать заявления «Программа выполнена»

Резюме

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

Источник

Операторы условного перехода (IF …)

Существует три модификации оператора условного перехода:

IF-THEN | IF-THEN-ELSIF ——- | ————- IF условие THEN | IF условие1 THEN последовательность команд; | 1-я последовательность команд; END IF; | ELSIF условие2 THEN | 2-я последовательность команд; IF-THEN-ELSE | … ———— | ELSIF условиеN THEN IF условие THEN | N-я последовательность команд; 1-я последовательность команд; | [ ELSE ELSE | N+1-я последовательность команд; ] 2-я последовательность команд; | END IF; END IF; |

Во всех модификациях если «условие» или «условие1″ истинно (TRUE), то выполняется «последовательность команд» или «1-я последовательность команд» и управление передается на первый оператор после END IF. Если же оно ложно (FALSE), то:

  • в модификации IF-THEN управление передается на первый оператор после END IF;
  • в модификации IF-THEN-ELSE выполняется 2-я последовательность команд и управление передается на первый оператор после END IF;
  • в модификации IF-THEN-ELSIF проверяется условие 2; если оно истинно, то выполняется 2-я последовательность команд и управление передается на первый оператор после END IF; если условия 1 и 2 ложны, а условие 3 истинно, то выполняется 3-я последовательность команд и управление передается на первый оператор после END IF; наконец, если условия 1, 2, …, N ложны, то выполняется N+1-я последовательность команд и управление передается на первый оператор после END IF.

Все это справедливо, если внутри последовательности команд нет операторов, осуществляющих переход за пределы этой последовательности.

Метки и оператор безусловного перехода (GOTO)

В любом месте программы может быть поставлена метка, имеющая синтаксис: <<имя_метки>>

Оператор GOTO позволяет осуществить безусловный переход к метке, имя которой должно быть уникальным внутри программы или блока PL/SQL. Например, управление передается вниз к помеченному оператору:

BEGIN

GOTO insert_row;

<>

INSERT INTO shtat VALUES …

END;

В следующем примере управление передается вверх к помеченной последовательности операторов:

BEGIN

<>

BEGIN

UP shtat SET …

END;

GOTO up_row;

END;

Следует отметить, что использование GOTO (особенно в тех случаях, когда метка предшествует оператору GOTO) может привести к сложным, нераспознаваемым кодам ошибок, которые трудно обрабатывать. Поэтому реже используйте GOTO, тем более что этот оператор нельзя использовать для выполнения перехода:

  • в IF-блок, LOOP-блок или в другой блок, не включающий текущий;
  • из одного предложения IF-оператора к другому;
  • из внешнего блока в SUB-блок;
  • из обработчика особых ситуаций в текущий блок.
Читайте также:  Протоколы шмо естественно научного цикла

Операторы цикла (LOOP, WHILE…LOOP и FOR…LOOP)

Циклы служат для повторяемого выполнения последовательности команд. В PL/SQL используются три модификации операторов цикла: LOOP, WHILE…LOOP и FOR…LOOP.

Цикл LOOP имеет следующий синтаксис:

LOOP

последовательность команд;

END LOOP;

и приводит к бесконечному повторению последовательности команд, если внутри нее нет команд EXIT (выход из цикла), RAISE (вызов обработчика исключительных ситуаций) или GOTO (безусловный переход). Например,

LOOP

последовательность команд;

IF условие THEN EXIT;

END LOOP;

приведет к выходу из цикла после выполнения последовательности команд, как только условие станет истинным.

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

WHILE условие LOOP

последовательность команд;

END LOOP;

Наиболее распространен цикл FOR, имеющий следующий синтаксис:

FOR индекс IN [REVERSE] нижняя_граница..верхняя_граница LOOP

последовательность команд;

END LOOP;

Здесь индекс (счетчик циклов) изменяется от нижней до верхней границы с шагом 1, а при использовании «REVERSE» – от верхней до нижней границы с шагом. Например,

FOR i IN 1..3 LOOP – для i = 1, 2, 3

последовательность команд; – цикл выполняется 3 раза

END LOOP;

FOR i IN REVERSE 1..3 LOOP – для i = 3, 2, 1

последовательность команд; – цикл выполняется 3 раза

END LOOP;

Отметим, что в последнем случае пределы диапазона указываются в возрастающем, а не убывающем порядке.

Если нижняя граница равна верхней, последовательность выполняется один раз.

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

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

j IN -5..5 k IN REVERSE first..last step IN 0..TRUNC(high/low) * 2 code IN ASCII(‘A’)..ASCII(‘J’)

Объявлять индекс не нужно – он объявлен неявно как локальная переменная типа integer.

PL/SQL позволяет определять диапазон цикла динамически во время выполнения. Например:

SELECT COUNT(otdel) INTO shtat_count FROM shtat;

FOR i IN 1..shtat_count LOOP

END LOOP;

Значение «shtat_count» – неизвестно во времени компиляции; предложение SELECT определяет это значение во время выполнения.

Индекс может использоваться в выражениях внутри цикла, но не может изменяться. Например:

FOR ctr IN 1..10 LOOP

IF NOT finished THEN

INSERT INTO … VALUES (ctr, …); – правильно

factor := ctr * 2; – правильно

ELSE

ctr := 10; – неправильно

END IF;

END LOOP;

Индекс определен только внутри цикла и на него нельзя ссылаться снаружи цикла. После выполнения цикла индекс неопределен. Например:

FOR ctr IN 1..10 LOOP

END LOOP;

sum := ctr – 1; – неверно

Подобно PL/SQL блокам, циклы могут быть помечены. Метка устанавливается в начале оператора LOOP, следующим образом:

<>

LOOP

последовательность команд;

END LOOP;

Имя метки может также появляться в конце утверждения LOOP как в примере:

<>

LOOP

END LOOP my_loop;

Помеченные циклы используются для улучшения чтения программы (разборчивости). С любой формой утверждения EXIT можно завершать не только текущий цикл, но и любой внешний цикл. Для этого маркируйте внешний цикл, который надо завершить, и используйте метку в утверждении EXIT, следующим образом:

<>

LOOP

LOOP

EXIT outer WHEN … – завершаются оба цикла

END LOOP;

END LOOP outer;

Если требуется преждевременно выйти из вложенного цикла FOR, маркируйте цикл и используйте метку в утверждении EXIT. Например:

<>

FOR i IN 1..5 LOOP

FOR j IN 1..10 LOOP

FETCH s1 INTO ShRec;

EXIT outer WHEN s1%NOTFOUND; – завершаются оба цикла

END LOOP;

END LOOP outer;

– управление передается сюда

Операторы EXIT, EXIT-WHEN и NULL

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

количество операторов EXIT. Имеются две формы EXIT: EXIT и EXIT-WHEN.

По оператору EXIT цикл завершается немедленно и управление переходит к следующему за END LOOP оператору. Например:

LOOP

IF … THEN

EXIT; – цикл завершается немедленно

END IF;

END LOOP;

– управление переходит сюда

По оператору EXIT-WHEN цикл завершиться только в том случае, когда становится истинным условие в предложении WHEN. Например:

LOOP

FETCH s1 INTO …

EXIT WHEN s1%NOTFOUND; – конец цикла, если условие верно

END LOOP;

CLOSE s1;

Оператор EXIT-WHEN позволяет завершать цикл преждевременно. Например, следующий цикл обычно выполняется десять раз, но как только не находится значение s1, цикл завершается независимо от того сколько раз цикл выполнился.

FOR j IN 1..10 LOOP

FETCH s1 INTO ShRec;

EXIT WHEN s1%NOTFOUND; – выход при отсутствии возвращаемой строки

END LOOP;

NULL – пустой оператор; он передает управление к следующему за ним оператору.

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

Запись опубликована 09.04.2010 в 6:32 дп и размещена в рубрике Oracle7 краткий справочник. Вы можете следить за обсуждением этой записи с помощью ленты 2.0. Можно оставить комментарий или сделать обратную ссылку с вашего сайта.

Источник