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

·  Неявный курсор создается сервером базы данных автоматически, когда исполняемая секция блока PL/SQL выполняет команду DML или SELECT PL/SQL

·  Явный курсор создает сам пользователь. Он присваивает курсору имя и управляет курсором с помощью специальных команд

Атрибуты неявного курсора

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

Атрибут

Описание

SQL%ROWCOUNT

Целое количество строк, выбранных последней командой SQL

SQL%FOUND

Логический атрибут. TRUE, если последней командой SQL была выбрана хотя бы одна строка

SQL%NOTFOUND

Логический атрибут. TRUE, если последней командой SQL не выбрано ни одной строки

SQL%ISOPEN

Логический атрибут. TRUE, если курсор открыт. Для неявного курсора всегда имеет значение FALSE, т.к. неявный курсор закрывается сразу же после выполнения

Пример использования атрибутов неявного курсора:

SQL> DECLARE

  2   v_count NUMBER;

  3  BEGIN

  4   UPDATE emp SET comm = comm+100 WHERE comm IS NOT NULL;

  5   v_count := SQL%ROWCOUNT;

  6   DBMS_OUTPUT.put_line (TO_CHAR(v_count) || ' rows updated');

  7  END;

  8  /

4 rows updated

PL/SQL procedure successfully completed.

Явные курсоры

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

Управление явными курсорами осуществляется в четыре этапа:

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

2.  Открытие курсора
выполнение запроса, связывание всех используемых переменных, выявление активного набора строк

3.  Выборка данных курсора
загрузка текущей строки курсора в переменные

4.  Закрытие курсора
освобождение активного набора строк

Описание курсора

Для описания явного курсора используется оператор CURSOR.

DECLARE

   CURSOR имя_курсора IS команда_select;

имя_курсора – идентификатор курсора PL/SQL

команда_select – команда SELECT без предложения INTO

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

SQL> DECLARE

  2     v_ename emp.ename%TYPE;

  3     v_sal emp.sal%TYPE;

  4     v_job emp.job%TYPE;

  5     CURSOR sal_cursor IS

  6        SELECT ename, sal FROM emp

  7        WHERE LOWER(job)=LOWER(v_job);

  8  BEGIN

  9     NULL;

 10  END;

 11  /

PL/SQL procedure successfully completed.

Открытие курсора

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

OPEN имя_курсора;

SQL> DECLARE

  2     v_ename emp.ename%TYPE;

  3     v_sal emp.sal%TYPE;

  4     v_job emp.job%TYPE;

  5     CURSOR sal_cursor IS

  6        SELECT ename, sal FROM emp

  7        WHERE LOWER(job)=LOWER(v_job);

  8  BEGIN

  9     v_job := 'manager';

 10     OPEN sal_cursor;

 11  END;

 12  /

PL/SQL procedure successfully completed.

Выборка данных курсора

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

FETCH имя_курсораINTO список_переменных;

Список_переменных должен включать столько же переменных, сколько столбцов указано в запросе. Типы данных должны быть совместимы. После того, как текущая строка выбрана из активного множества, курсор указывает на следующую строку. Так происходит до тех пор, пока FETCH выбирает значения. Если FETCH не выбирает ни одной строки, значит строк в активном множестве не осталось, и исключение не вызывается. Необходимо всегда проверять остались ли строки в курсоре, используя для этого атрибуты явного курсора.

SQL> DECLARE

  2     v_ename emp.ename%TYPE;

  3     v_sal emp.sal%TYPE;

  4     v_job emp.job%TYPE;

  5     CURSOR sal_cursor IS

  6        SELECT ename, sal FROM emp

  7        WHERE LOWER(job)=LOWER(v_job);

  8  BEGIN

  9     v_job := 'manager';

 10     OPEN sal_cursor;

 11     FETCH sal_cursor INTO v_ename, v_sal;

 12  END;

 13  /

PL/SQL procedure successfully completed.

Закрытие курсора

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

CLOSE имя_курсора;

SQL> DECLARE

  2     v_ename emp.ename%TYPE;

  3     v_sal emp.sal%TYPE;

  4     v_job emp.job%TYPE;

  5     CURSOR sal_cursor IS