Язык PL/SQL. Иван Сергеевич Задворьев. Читать онлайн. Newlib. NEWLIB.NET

Автор: Иван Сергеевич Задворьев
Издательство: ЛитРес: Самиздат
Серия:
Жанр произведения: Базы данных
Год издания: 2017
isbn:
Скачать книгу
WHILE

      Цикл WHILE с предусловием позволяет выполнить одну и ту же последовательность команд PL/SQL пока истинно проверяемое предусловие.

      С помощью цикла WHILE найдем число, факториал которого является наименьшим числом, впервые превышающим 1 000 000 000 000:

      SQL> DECLARE

      2 arg NUMBER; – Переменная для вычисления факториала

      3 i NUMBER; – Переменная-счетчик

      4 limit NUMBER := 1000000000000;– Граница

      5 text1 VARCHAR2(80):='n! числа, впервые превышающий 1000000000000;

      6

      7 BEGIN

      8 i := 0;

      9 arg := i;

      10 WHILE arg < 1000000000000 LOOP

      11 arg := arg*(i+1);

      12 i := i + 1;

      13 END LOOP;

      14 DBMS_OUTPUT.PUT_LINE(text1);

      15 DBMS_OUTPUT.PUT_LINE(TO_CHAR(arg));

      16 DBMS_OUTPUT.PUT_LINE('Искомое число = '||TO_CHAR(i));

      17 END;

      /

      n! числа,впервые превышающий 1000000000000

      1307674368000

      Искомое число = 15

      PL/SQL procedure successfully completed.

      Отметим, что если условие цикла WHILE изначально ложно (FALSE), то цикл не выполнится ни разу.

      Цикл FOR

      Цикл FOR («цикл со счетчиком»), используется в том случае, когда известно, сколько раз нужно выполнить итерацию цикла. Приведем пример вычисления факториала заданного числа.

      SQL> DECLARE

      2 arg NUMBER := 1;

      3 n NUMBER := 20;

      4 text1 VARCHAR2(30) := 'Факториал числа '||n||' = ';

      5 BEGIN

      6 FOR i IN 1..n LOOP

      7 arg := arg*i;

      8 END LOOP;

      9 DBMS_OUTPUT.PUT_LINE(text1||TO_CHAR(arg));

      10 END;

      /

      Факториал числа 20 = 2432902008176640000

      PL/SQL procedure successfully completed.

      Обратите внимание, что счетчик – управляющую переменную цикла (в данном случае i) объявлять в разделе объявлений не нужно, она объявляется автоматически с областью видимости между ключевыми словами LOOP и END LOOP.

      При рассмотрении циклов FOR обычно возникают два вопроса:

      есть ли возможность сделать так, чтобы значения счетчика цикла не возрастали, а уменьшались?

      есть ли возможность нетривиальных, то есть не на единицу, приращений шага счетчика цикла?

      Цикл с ключевым словом REVERSE

      Цикл со счетчиком, кратным 10

      SQL> BEGIN

      2 FOR i IN REVERSE 1..5 LOOP

      3 DBMS_OUTPUT.PUT_LINE(i);

      4 END LOOP;

      5 END;

      6 /

      5

      4

      3

      2

      1

      PL/SQL procedure successfully completed.

      SQL> BEGIN

      2 FOR i IN 1..20 LOOP

      3 IF MOD(i,10)=0 THEN

      4 – тело цикла

      5 DBMS_OUTPUT.PUT_LINE(i);

      6 END IF;

      7 END LOOP;

      8 END;

      9 /

      10

      20

      PL/SQL procedure successfully completed.

      На оба вопроса ответы положительные – такие возможности в языке PL/SQL имеются. Для обратного цикла в конструкции FOR LOOP следует указать ключевое слово REVERSE. Для нетривиальных приращений нужно внутри цикла с помощью команды IF просто пропускать шаги с ненужными значениями счетчика. Счетчик цикла всегда изменяется на единицу, просто на некоторых шагах цикла ничего делать не нужно.

      Команда CONTINUE

      Команда CONTINUE появилась в версии Oracle 11g. При истинности условия, записанного в конструкции WHEN команды CONTINUE, выполнение текущей итерации цикла прекращается и происходит переход на начало следующей итерации.

      Благодаря команде CONTINUE можно, например, вынести проверки в начало цикла. Перепишем приведенный выше пример с нетривиальным приращением