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

  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     CLOSE sal_cursor;

 13  END;

 14  /

PL/SQL procedure successfully completed.

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

Информацию о состоянии курсора можно получить с помощью атрибутов явного курсора:

Атрибут

Описание

имя_курсора%ROWCOUNT

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

имя_курсора %FOUND

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

имя_курсора %NOTFOUND

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

имя_курсора %ISOPEN

Логический атрибут. Имеет значение TRUE, если курсор открыт

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

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     LOOP

 12        FETCH sal_cursor INTO v_ename, v_sal;

 13        IF sal_cursor%NOTFOUND THEN

 14           EXIT;

 15        END IF;

 16     END LOOP;

 17     DBMS_OUTPUT.put_line(TO_CHAR(sal_cursor%ROWCOUNT) || ' rows are fetched');

 18     CLOSE sal_cursor;

 19  END;

 20  /

3 rows are fetched

PL/SQL procedure successfully completed.

Использование записи PL/SQL

Удобно использовать запись PL/SQL для хранения значений данных из активного набора.

SQL> DECLARE

  2     v_job emp.job%TYPE;

  3     CURSOR sal_cursor IS

  4        SELECT ename, sal FROM emp

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

  6     v_rec sal_cursor%ROWTYPE;

  7  BEGIN

  8     v_job := 'manager';

  9     OPEN sal_cursor;

 10     FETCH sal_cursor INTO v_rec;

 11     CLOSE sal_cursor;

 12  END;

 13  /

PL/SQL procedure successfully completed.

Курсоры с параметрами

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

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

CURSOR имя_курсора [(имя_параметра тип_данных, ...)] IS команда_select;

имя_курсора – имя курсора

имя_параметра – имя параметра, которое позволяет ссылаться на него в выражении SELECT

тип_данных – скалярный тип данных параметра. Размер параметра не задается

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

Если Вы описали курсор с параметрами, то параметры указываются в дальнейшем при открытии курсора:

OPEN имя_курсора [(имя_параметра, ...)];

SQL> DECLARE

  2     v_ename emp.ename%TYPE;

  3     v_sal emp.sal%TYPE;

  4     CURSOR sal_cursor (v_job VARCHAR2) IS

  5        SELECT ename, sal FROM emp

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

  7  BEGIN

  8     OPEN sal_cursor('manager');

  9     FETCH sal_cursor INTO v_ename, v_sal;

 10     DBMS_OUTPUT.put_line(v_ename || ' - ' || TO_CHAR(v_sal));

 11     CLOSE sal_cursor;

 12  END;

 13  /

JONES - 2975

PL/SQL procedure successfully completed.

Циклы FOR с курсорами

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

FOR имя_записиIN имя_курсораLOOP

   операторы;

ENDLOOP;

имя_записи -   имя записи, управляющей циклом. Явного описания записи не требуется, т.к. она видна только внутри цикла

имя_курсора – имя объявленного курсора

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

SQL> DECLARE

  2     CURSOR sal_cursor (v_job VARCHAR2) IS

  3        SELECT ename, sal FROM emp

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

  5  BEGIN

  6     FOR rec_cursor IN sal_cursor('manager') LOOP

  7         DBMS_OUTPUT.put_line(rec_cursor.ename || ' - ' || TO_CHAR(rec_cursor.sal));

  8     END LOOP;

  9  END;

 10  /

JONES - 2975

BLAKE - 2850

CLARK - 2450

PL/SQL procedure successfully completed.

Литература

1.  Вильям Дж. Пэйдж Использование Oracle8/8i: пер. с англ. – М.: Издательский дом "Вильямс", 1999.