Взаимодействие с базой данных Oracle, страница 2

SQL> DECLARE

  2   v_job emp.job%TYPE;

  3   v_comm emp.comm%TYPE;

  4  BEGIN

  5   SELECT job, comm INTO v_job, v_comm FROM emp WHERE ename='ADAMS';

  6   IF v_job='PRESIDENT' THEN

  7      DBMS_OUTPUT.put_line('Employee is President');

  8   ELSIF v_comm IS NOT NULL THEN

  9      DBMS_OUTPUT.put_line('Employee has a commission percent');

 10   ELSE

 11      DBMS_OUTPUT.put_line('Employee is not President and has not a commission percent');

 12   END IF;

 13  END;

 14  /

Employee is not President and has not a commission percent

PL/SQL procedure successfully completed.

Простой цикл

Простой цикл – это группа повторно выполняемых операторов, ограниченных операторами LOOP и END LOOP (тело цикла). Каждый раз, при достижении оператора END LOOP, управление передается на начало цикла. Такой цикл бесконечен. Чтобы сделать цикл конечным, необходимо добавить оператор EXIT, который передает управление оператору, следующему за оператором END LOOP.

LOOP

   операторы;

   EXIT [WHEN условие];

END LOOP;

SQL> DECLARE

  2   v_count NUMBER := 1;

  3  BEGIN

  4   LOOP

  5      v_count := v_count +10;

  6      EXIT WHEN v_count>1000;

  7   END LOOP;

  8   DBMS_OUTPUT.put_line(v_count);

  9  END;

 10  /

1001

PL/SQL procedure successfully completed.

Цикл FOR

Цикл FOR – это, также, группа повторно выполняемых операторов, ограниченных операторами LOOP и END LOOP. Однако ключевому слову LOOP предшествует оператор, задающий количество повторов.

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

   операторы;

ENDLOOP;

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

REVERSE – вызывает уменьшение индекса при каждом выполнении цикла

нижняя_граница – нижняя граница изменения индекса

верхняя_граница – верхняя граница изменения индекса

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

SQL> DECLARE

  2   v_count NUMBER := 0;

  3  BEGIN

  4   FOR i IN REVERSE 1..10 LOOP

  5      v_count := i;

  6   END LOOP;

  7   DBMS_OUTPUT.put_line(v_count);

  8  END;

  9  /

1

PL/SQL procedure successfully completed.

SQL> DECLARE

  2   v_count NUMBER := 0;

  3  BEGIN

  4   FOR i IN 1..10 LOOP

  5      v_count := i;

  6   END LOOP;

  7   DBMS_OUTPUT.put_line(v_count);

  8  END;

  9  /

10

PL/SQL procedure successfully completed.

Цикл WHILE

Цикл WHILE используется для повторного выполнения операторов до тех пор, пока выполняется заданное условие. Условие проверяется в начале каждой итерации. Когда значение условия становится FALSE (ложь) или NULL (не определено), выполнение цикла прекращается. Если условие всегда TRUE (истина), цикл становится бесконечным.

WHILE условиеLOOP

   операторы;

END LOOP;

SQL> DECLARE

  2   v_count NUMBER := 1;

  3  BEGIN

  4   WHILE v_count<1000 LOOP

  5      v_count := v_count +10;

  6   END LOOP;

  7   DBMS_OUTPUT.put_line(v_count);

  8  END;

  9  /

1001

PL/SQL procedure successfully completed.

Вложенные циклы

Циклы могут быть вложены один в другой, причем циклы FOR можно вкладывать в циклы WHILE и наоборот. Каждый цикл завершается оператором END LOOP. Завершение внутреннего цикла по умолчанию не вызывает завершения внешнего цикла.

SQL> DECLARE

  2   v_count NUMBER := 0;

  3   j NUMBER := 0;

  4  BEGIN

  5   FOR i IN 1..100 LOOP

  6      LOOP

  7         v_count := v_count + 1;

  8         IF j>10 THEN

  9            EXIT;

 10         END IF;

 11         j := j + 1;

 12      END LOOP;

 13   END LOOP;

 14   DBMS_OUTPUT.put_line(v_count);

 15  END;

 16  /

111

PL/SQL procedure successfully completed.

Чтобы из внутреннего цикла вызвать завершение внешнего цикла, можно использовать метки. Цикл помечается меткой в двойных угловых скобках <<метка>>, и завершение внешнего цикла обеспечивается оператором EXIT, после которого указывается метка (без угловых скобок) того цикла, который требуется завершить. Метка подчиняется тем же правилам, что и остальные идентификаторы.

SQL> DECLARE

  2   v_count NUMBER := 0;

  3   j NUMBER := 0;

  4  BEGIN

  5   <<out>> FOR i IN 1..100 LOOP

  6      LOOP

  7         v_count := v_count + 1;

  8         IF j>10 THEN

  9            EXIT out;

 10         END IF;

 11         j := j + 1;

 12      END LOOP;

 13   END LOOP;

 14   DBMS_OUTPUT.put_line(v_count);

 15  END;

 16  /

12

PL/SQL procedure successfully completed.

Курсор SQL

Для каждой команды SQL сервер базы данных выделяет область памяти, в которой команда SQL разбирается и выполняется. Эта область памяти называется курсором. Курсоры бывают двух типов: неявные и явные: