Курсор – это переменная, состоящая из строк некоторой таблицы или результата запроса. Сформировав курсор, можно в программе читать и обрабатывать каждую строку курсора. Если курсор построен на основе таблицы, то можно модифицировать и удалять текущую позицию курсора.
Типичная последовательность, при операциях в данном случае с явными (определенными курсорами) будет такая:
- Объявление курсора и структуры данных, в которую, будут помещены найденные строки.
- Открытие курсора.
- Последовательная выборка данных.
- Закрытие курсора.
Неявные курсоры. Любой оператор DML включает в себя курсор. Так как, каждый оператор DML выполняется в пределах контекстной области и поэтому имеет курсор указывающий на контекстную область. В отличии от явных, SQLкурсор не открывается и не закрывается. PL/SQL сам неявно открывает SQLкурсор, обрабатывает SQLоператор и закрывает SQLкурсор. Для SQLкурсора операторы FETCH, OPEN, CLOSE не нужны.
Атрибуты курсора.
%ISOPEN
- Возвращает TRUE если курсор открыт, FALSE если курсор закрыт.
%FOUND
- Возвращает INVALID_CURSOR если курсор объявлен, но не открыт; или если курсор был закрыт.
- Возвращает NULL если курсор открыт, но выборка не была выполнена.
- Возвращает TRUE если выборка была удачно завершена.
- Возвращает FALSE если нет возвращаемых строк.
%NOTFOUND
- Возвращает INVALID_CURSOR если курсор объявлен, но не открыт; или если курсор был закрыт.
- Return NULL если курсор открыт, но выборка не была выполнена.
- Возвращает FALSE если выборка была удачно завершена.
- Возвращает TRUE если нет возвращаемых строк.
%ROWCOUNT
- Возвращает INVALID_CURSOR если курсор объявлен, но не открыт; или если курсор был закрыт.
- Возвращает число возвращаемых строк.
- Атрибут ROWCOUNT не дает реального количества строк, пока вы не пройдете весь курсор. Другими словами, вы не должны полагаться на этот атрибут, чтобы сказать, сколько строк в курсоре после его открытия.
Цель использования курсора, в большинстве случаев, это получение строк из курсора таким образом, чтобы некоторый тип операций мог быть выполнен на данных. После объявления и открытия курсора, следующим шагом является выборка строк из курсора с помощью оператора FETCH.
- DECLARE
- CURSOR get_offices IS
- SELECT * FROM OFFICES;
- BEGIN
- DBMS_OUTPUT.enable;
- FOR v_gt IN get_offices LOOP
- DBMS_OUTPUT.put_line('Get Data: '||TO_CHAR(v_gt.OFFICE)||' '||v_gt.CITY||' '
- ||v_gt.REGION||' '||TO_CHAR(v_gt.MGR)||' '||TO_CHAR(v_gt.TARGET)||'
- '||TO_CHAR(v_gt.SALES));
- END LOOP;
- END;