Курсор – это переменная, состоящая из строк некоторой таблицы или результата запроса. Сформировав курсор, можно в программе читать и обрабатывать каждую строку курсора. Если курсор построен на основе таблицы, то можно модифицировать и удалять текущую позицию курсора.
Открытие курсора предложением OPEN исполняет предложение SELECT и идентифицирует АКТИВНОЕ МНОЖЕСТВО, т.е. все строки, удовлетворяющие поисковым условиям запроса. Для курсоров, объявленных с фразой FOR UPDATE, предложение OPEN также осуществляет блокировку этих строк. Пример предложения OPEN: OPEN c1;
Предложение OPEN не извлекает строк активного множества. Для этого используется предложение FETCH. Курсору могут быть переданы параметры при открытии. Например, при объявлении курсора CURSOR c1 (my_ename CHAR, my_comm NUMBER) IS SELECT любое из следующих предложений открывает этот курсор:
- OPEN c1('ATTLEY', 300);
- OPEN c1(employee_name, 150);
- OPEN c1('THURSTON', my_comm);
Предложение FETCH извлекает очередную строку из активного множества. При каждом выполнении FETCH курсор продвигается к следующей строке в активном множестве. Пример предложения FETCH
FETCH c1 INTO my_empno, my_ename, my_deptno;
Для каждого значения столбца, извлекаемого запросом, ассоциированного с курсором, в списке INTO должна быть соответствующая переменная, имеющая совместимый с этим столбцом тип данных. Обычно вы используете не индивидуальные переменные, а запись:
- OPEN c1;
- LOOP
- FETCH c1 INTO my_record;
- EXIT WHEN c1%NOTFOUND;
- -- обработать извлеченные данные
- END LOOP;
Предложение CLOSE деактивирует курсор, и активное множество становится неопределенным. Пример предложения CLOSE:
CLOSE c1;
После того, как курсор закрыт, его можно снова открыть.