Введение в СУБД "Oracle". Космачев В.М - 59 стр.

UptoLike

ГУАП МЦИТ
Введение в «ORACLE»
Под ред. проф. В.М.Космачёва
59
CURSOR Curl IS SELECT * FROM LECTURE; Определение курсора
BEGIN
OPEN Curl; -- Курсор должен быть открыт
FOR I IN 1..3 LOOP
FETCH Curl INTO Argl,Arg2, Arg3,Arg4;
DBMSJDUTPUT.PUT_LINE(TO_CHAR(Argl);
END LOOP;
CLOSE Cur1;
END;
/
В данной программе неудачно управление счетчиком, поскольку цикл настроен на получение конкретного числа
строк, которых может и не быть в таблице.
В PL/SQL для курсоров предусмотрены специальные методы %NOTFOUND и %FOUND, принимающие
противоположные булевские значения. Метод %NOTFOUND вращает значение TRUE, если выборка в курсор пустая,
то есть не содержит строки. После открытия курсора, но до первой команды FETCH, методы %FOUND,
%NOTFOUND принимают неопределенное значение (UNKNOWN). Незнание этого факта может привести к
достаточно распространенной ошибке. При организации цикла с использованием оператора WHILE и выполнением
проверки на истинность %FOUND на входе, цикл не будет выполнен ни разу, несмотря на наличие данных в таблице
Метод %ROWCOUNT возвращает число строк, выбранных после открытия курсора. Бывает полезно использование
метода %ISOPEN логического типа, возвращающего TRUE, если курсор открыт: этот метод применяется перед
использованием команды FETCH для проверки -- открыт ли курсор или нет.
Обратите внимание на повторный вывод последней строки. Попытайтесь исправить организацию цикла для
устранения повторного вывода.
Курсор может содержать параметр, синтаксис такого курсора имеет следующий вид:
CURSOR cursor_name [(parametr_name datatype,...)] IS select_statement;
параметр добавляется при открытии курсора;
каждый раз рекомендуется открывать курсор, когда меняется активное множество элементов.
DECLARE
CURSOR emp_cursor (p_deptno number, p_job varchar2) IS
SELECT empno,ename FROM emp WHERE (deptno=p_deptno)AND(job = p_job);
BEGIN
OPEN emp_cursor(10,'clerk');
Оператор определения курсора может содержать параметрический запрос. Значения параметра задаются при
открытии курсора.
После выбора всех строк из таблицы курсор должен быть закрыт, синтаксис команды:
CLOSE cursor name;
Если возникнет необходимость, курсор может быть повторно открыт, однако, после закрытия курсора нельзя
пользоваться командой FETCH
В большинстве случаев, требующих явного курсора, вы можете использовать курсорные циклы FOR вместо
предложений OPEN, FETCH и CLOSE, чтобы упростить кодирование. Курсорный цикл FOR неявно объявляет
индекс своего цикла как запись %ROWTYPE, открывает курсор, итеративно извлекает строки данных из
активного множества в поля записи, и закрывает курсор после того, как все строки обработаны.
Базовый синтаксис:
FOR record_name IN {cursor_name | (select_expr) } LOOP
. . . .
END LOOP;
При этом:
объявлять record_name, открывать и закрывать курсор -- не следует