PL/SQL Курсоры
Курсор – специальный элемент, связанный с SQL-оператором SELECT. Объявление курсора происходит в секции объявления базового блока. Работа с курсором – посредством команд OPEN, FETCH, CLOSE
Явные курсоры: объявление CURSOR имя_курсора [([параметр_1 [, параметр_2 …])] [RETURN спецификация_возврата] [IS оператор_select [FOR UPDATE [OF таблица_или_столбец_1 [, таблица_или столбец_2 …] ]]
Явные курсоры: объявление Параметры: Имя_переменной [IN] тип [ { := | DEFAULT } значие_по_умолчанию ]
Явные курсоры: объявление Параметры – могут использоваться в операторе SELECT Спецификация возврата – записи какого типа будут выбираться оператором SELECT Таблица_или_столбец – имя столбца, который предстоит обновить, или таблицы строки которой будут удалены или изменены
Явные курсоры: объявление Для привязки курсора к запросу SELECT можно указать конструкцию OPEN-FOR (в секции выполнения): OPEN {cursor_variable} FOR { select_statement };
Пример объявления курсора: CURSOR person_cursor(id_start IN persons.id%TYPE, id_end IN persons.id%TYPE) IS SELECT * FROM persons WHERE id BETWEEN id_start AND id_end;
Пример объявления курсора: CURSOR person_cursor(id_start IN persons.id%TYPE, id_end IN persons.id%TYPE) RETURN persons%ROWTYPE IS SELECT * FROM persons WHERE id BETWEEN id_start AND id_end;
Атрибуты курсора Имя_курсора%ISOPEN – открыт ли курсор Имя_курсора%ROWCOUNT – количество строк таблицы, возвращенных оператором SELECT Имя_курсора%FOUND – проверка, была ли успешной последняя попытка получения записи из курсора Имя_курсора%NOTFOUND – противоположный FOUND атрибут
Использование команд OPEN имя_курсора[([параметр_1 [, параметр_2 …])] FETCH имя_курсора INTO переменная_или_список_переменных; CLOSE имя_курсора
Курсорный цикл FOR FOR запись_курсора IN имя_курсора LOOP операторы; END LOOP;
Курсорный цикл LOOP FETCH c1 INTO my_record; EXIT WHEN c1%NOTFOUND; END LOOP;
Использование CURRENT OF Можно изменять и удалять ту строчку, таблица, на которой в данный момент позиционирован курсор: UPDATE … SET … WHERE CURRENT OF cursor_name; DELETE FROM … WHERE CURRENT OF cursor_name; ! Для этого нужно указать FOR UDPATE при создании курсора
Вопросы: Приведите пример выгодного использования курсоров в сравнении с только запросами SQL ?
Задания При помощи курсора вывести все записи таблицы persons в формате: -
Задания При помощи курсора вывести все записи таблицы persons с заданным диапазоном id (в параметрах курсора) в формате: -
Задания При помощи курсора удалить записи таблицы persons с заданным диапазоном id (в параметрах курсора).
Задания Вывести на экран информацию о таблицах, принадлежащих пользователю, а также об их атрибутах в виде: Table: Имя_таблицы Имя поля – тип поля … Подсказка: использовать USER_ALL_TABLES, USER_TAB_COLUMNS Информацию получить при помощи курсора!