Для обработки явного курсора в PL/SQL необходимо выполнить четыре
действия:
1. Объявить курсор.
Открыть курсор для запроса.
Выбрать результаты в переменные PL/SQL.
Закрыть курсор.
Объявление курсора является единственным действием, которое выполняется в разделе объявлений блока. Другие три действия производятся в выполняемом разделе или в разделе исключительных ситуаций.
Объявление курсора
При объявлении курсора ему назначается имя и ставится в соответствие некоторый оператор SELECT. Синтаксис объявления курсора:
CURSOR имя_курсорс IS onepamop_SELECT
где — это имя курсора, a onepamop_SELEG. — запрос, который
будет обрабатываться. Что касается области действия и области видимости, то курсоры отвечают стандартным правилам, установленным для идентификаторов PL/SQL (см. главу 3). Так как имя курсора является идентификатором PL/SQL, оно должно быть объявлено до того, как на него будет произведена ссылка. Можно использовать любые операторы SELECT, в том числе соединения (join) и операторы, в состав которых входят конструкции UNION (объединение) и MINUS (минус).
Внимание
| Конструкция INTO не входит в состав оператора SELECT, а является частью оператора FETCH.
При объявлении курсора можно указывать переменные PL/SQL, которые рассматриваются в качестве переменных привязки. Для курсоров справедливы обычные правила по определению области действия, поэтому эти переменные должны быть видимы в точке объявления курсора. Например, ниже приводится правильный раздел объявлений:
Для гарантии что все переменные, на которые производятся
ссылки при объявлении курсора, уже объявлены, рекомендуется создавать все курсоры в конце раздела объявлений. В данной книге соблюдается это соглашение. Единственным исключением может быть ситуация, когда имя курсора указывается в ссылке — например, в атрибуте %ROWTYPE. (при создании записи с полями, соответствующими списку выбора курсора). В этом случае курсор должен быть объявлен до того, как на него будет произведена ссылка.
Открытие курсора
Курсор открывается следующим образом:
OPEN имя_курсора;
где имя_курсорa идентифицирует предварительно объявленный курсор. Когда курсор открывается, происходит следующее:
• Анализируются значения переменных привязки.
• На основе значений переменных привязки и содержимого таблиц к которым обращается запрос, определяется активный набор.
• Указатель активного набора устанавливается на первую строку.
Переменные привязки анализируются только во время открытия курсора. Для примера рассмотрим следующий блок PL/SQL:
При открытии курсора c_Building в переменных v_Department и v_Course содержатся соответственно 'HIS' и 101. Эти значения используются в запросе. Затем значения переменных v_Department и v_Course изменяются, но это никак не влияет на активный набор запроса. Чтобы применялись новые значения, курсор необходимо закрыть и открыть заново. В соответствии с транзакционной моделью (см. главу 4) запрос видит изменения, внесенные в базу данных до выполнения оператора OPEN, и изменения сделанные в базе данных текущей транзакцией. Если другой сеанс изменил данные, но еще не зафиксировал эти изменения, они видны не будут.
Активный набор, т.е. набор строк, удовлетворяющих условию запроса, определяется во время открытия курсора. К примеру, в предыдущем запросе возвращается одна строка ("Building Seven'). Для таблицы (таблиц), указанной в конструкции FROM запроса, проверяется условие WHERE, и все строки, для которых условие истинно, добавляются к активному набору. Указатель на этот набор также создается во время открытия курсора. Он сообщает, какая строка должна быть считана курсором в следующий раз.
Открытый курсор нельзя открыть еще раз. Если команда OPEN применяется к уже открытому курсору, Oracle генерирует ошибку ORA-6511, например:
< Предыдущая | Следующая > |
---|