Эффективное программирование на PL/SQL - Когда выполнять нечего, выполняем CONTINUE

ОГЛАВЛЕНИЕ

Когда выполнять нечего, выполняем CONTINUE

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

В Oracle Database 11 g в PL/SQL есть новая конструкция CONTINUE, которая используется в цикле. Это предложение перемещает логику в конец цикла, а затем на начало цикла. Вот небольшой пример, который показывает, как управление передаётся на конец цикла, когда счётчик не кратен 10.

begin
        for ctr in 1..100 loop
                continue when mod(ctr,10) != 0;
                dbms_output.put_line ('ctr='//ctr);
        end loop;
end;
/

Результат:

ctr=10
ctr=20
ctr=30
... и так далее ...

Другой вариант CONTINUE - это использование Названия Цикла.

begin
        <<OuterLoop>>
        for outer in 1..10 loop
                dbms_output.put_line ('-> outer='//outer);
                for inner in 1..10 loop
                        continue OuterLoop when mod(inner,3) = 0;
                        dbms_output.put_line ('..-> inner='//inner);
                end loop;
        end loop;
end;
/

Результат:

-> outer=1
..-> inner=1
..-> inner=2
-> outer=2
..-> inner=1
..-> inner=2
-> outer=3
..-> inner=1
..-> inner=2

... и так далее ...

Вместо использования предопределённой конструкции, такой как mod(inner,3), можно использовать функцию, которая выполняет некоторое вычисление.

begin
        <<OuterLoop>>
        for outer in 1..10 loop
                dbms_output.put_line ('-> outer='//outer);
                for inner in 1..10 loop
                        continue OuterLoop when (myfunc = 1);
                        dbms_output.put_line ('..-> inner='//inner);
                end loop;
        end loop;
end;
/

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