Для выполнения команды SELECT система выделяет определенную область, куда помещает помимо служебной информации и сами выбранные строки (активный набор строк). В PL/SQL имеется специальная конструкция, которая позволяет задать имя этой области и осуществить доступ к хранящейся там информации. Такая конструкция называется курсором. Существуют курсоры двух типов: явные и неявные.
Явные курсоры. Явный курсор должен быть явно объявлен пользователем. Для его объявления используется следующий синтаксис:
CURSOR имя_курсора [(список_параметров)] IS SELECT…;
Оператор SELECT определяет набор извлекаемых строк. Список параметров может отсутствовать. Если же параметры используются, то они описываются следующим образом:
Имя_параметра тип [{:=ï DEFAULT} значение];
Если указано значение параметра, то при открытии курсора этот параметр можно не указывать.
Управление явным курсором осуществляется в двух вариантах: явно и неявно.
При явном управлении курсором необходимо явно открыть курсор, явно выбрать строки из активного набора и явно закрыть курсор. При неявном управлении эти операции выполняются самой системой.
Явная форма управления курсорам. Для того чтобы явно открыть курсор, используется следующая конструкция:
OPEN имя_курсора [(список_параметров)];
В момент открытия курсора система выполняет указанный оператор SELECT с учетом передаваемых значений параметров, т. е. выбирает соответствующий набор строк, и указатель текущей записи устанавливается в этом наборе на первую строку. Однако строки программе не передаются. Чтобы получить строки одну за другой, используется оператор FETCH. Выборка строк допускается только в прямом направлении; продвижение по набору строк в обратном направлении невозможно. Синтаксис оператора FETCH:
FETCH имя_курсора INTO {имя_записи ï список_столбцов};
При выполнении оператора FETCH выбирается очередная строка, а указатель текущей записи передвигается на следующую строку в наборе строк. Если были выбраны все строки, то при попытке нового считывания ошибка не возникает, но и строка не выбирается.
Для того чтобы закрыть курсор, необходимо выполнить следующий оператор:
CLOSE имя_курсора;
После закрытия курсора все попытки считывания информации приведут к ошибке. Для организации явного управления можно использовать курсорные атрибуты.
Курсорные атрибуты.Для организации явного управления курсором используются курсорные атрибуты. Курсорные атрибуты представляют собой функции, возвращающие определенное значение в зависимости от выполненных действий. К ним относятся:
%ISOPEN – возвращающий значение TRUE, если курсор открыт, и FALSE, если курсор закрыт;
%FOUND – возвращающий значение TRUE, если строка найдена, и FALSE, если строка не найдена;
%NOTFOUND – возвращающий значение TRUE, если строка не найдена, и FALSE, если строка найдена;
%ROWCOUNT – возвращающий числовое значение, показывающее количество выбранных строк в курсоре;
Неявная форма управления курсором.Для автоматической обработки курсора используется специальная форма записи оператора цикл FOR – циклы FOR с курсором.
Открытие, выборка и закрытие курсора в этом случае происходит автоматически. Возвращаемая переменная-строка определяется неявно и на нее нельзя ссылаться извне области видимости цикла. При неявной форме управления курсор может также иметь параметры.
Неявные курсоры.Они создаются и открываются системой при выполнении операторов INSERT, UPDATE и DELETE, а также при выполнении однострочного оператора SELECT. Неявный курсор называется SQL-курсором. Он имеет свои атрибуты, аналогичные атрибутам явного курсора:
SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT
Однако в однострочном операторе SELECT нельзя использовать атрибут SQL%NOTFOUND, потому что, если при его выполнении информация из таблицы не будет выбрана, то сгенерируется исключение NO_DATA_FOUND. Атрибут SQL%NOTFOUND обычно используется в операторах UPDATE и DELETE для проверки, успешно или нет, выполнены соответствующие операторы.
Модификация данных в курсоре. Конструкция курсор позволяет помимо оперирования наборами данных таблиц выполнять и модификацию информации таблиц. Для этого используются две дополнительных конструкции:
FOR UPDATE [OF столбец1, столбец2…] [NOWAIT]
указываемая в операторе SELECT, который определяет строки формируемого активного набора, и
WHERE CURRENT OF имя_курсора
которая указывается в операторах UPDATE или DELETE, выполняемых в процессе выборки и обработки строк из активного набора.
В обычной ситуации строки, выбираемые в активный набор, не блокируются, и любой другой пользователь может осуществить их модификацию в базе данных. Если после этого закрыть и вновь открыть курсор, то получаешь доступ к новым, модифицированным строкам.
При использовании варианта FOR UPDATE с перечнем столбцов блокируется доступ других пользователей к указанным столбцам, но и обновлять информацию можно только в этих столбцах. Если же используется FOR UPDATE без перечня столбцов, то блокируется вся таблица, и соответственно обновлять можно информацию, хранящуюся в любых столбцах таблицы.