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 для хранения значений данных из активного набора.
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 имя_записи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.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.