Вы можете явно объявить курсор в разделе объявлений (локального блока или пакета). В этом случае курсор можно будет открывать и извлекать данные в одной или нескольких программах, причем возможности контроля будут шире, чем при использовании неявных курсоров.
Дополнительный уровень гибкости обеспечивают курсорные переменные (объявленные на основе типа REF CURSOR), которые позволяют передавать указатель на результирующее множество, полученное по запросу, из одной программы в другую. Любая программа, имеющая доступ к такой переменной, сможет открывать и закрывать курсор, а также выбирать из него данные.
Появившиеся в версии Oracle9/ Database выражения CURSOR преобразуют оператор SELECT в указатель (типа REF CURSOR) на результирующее множество и могут использоваться в сочетании с табличными функциями (о которых мы поговорим в главе 3) для повышения производительности приложений.
Подробно курсоры будут рассмотрены в главе 2.
Для исполнения оператора SQL внутри программы PL/SQL выполняет одни и те же операции для всех типов курсоров. В одних случаях PL/ SQL выполняет их автоматически, а в других (для явных курсоров) программисту необходимо написать соответствующий код.
Первым этапом обработки оператора SQL является его синтаксический анализ, который проводится для проверки корректности оператора и определения плана его выполнения.
Связывание
Связывание - это сопоставление значений из вашей программы (хост-переменных) заполнителям используемого оператора SQL.
Для статического SQL такое связывание выполняет само ядро PL/ SQL. Для динамического SQL программист, если он планирует использовать переменные связывания, должен явно запросить выполнение этой операции.
При открытии курсора переменные связывания используются для определения результирующего множества команды SQL. Указатель активной (текущей) строки устанавливается на первой строке. В некоторых случаях явное открытие курсора не требуется; ядро PL/SQL само выполняет эту операцию (например, для неявных курсоров или встроенного динамического SQL).
Исполнение
При выполнении запроса команда FETCH извлекает следующую строку из результирующего множества курсора. При каждой выборке PL/SQL передвигает курсор вперед на одну строку по результирующему множеству. При работе с явными курсорами следует помнить, что в случае, когда строк для извлечения больше нет, FETCH ничего не делает (не инициирует исключение).
На этом этапе курсор закрывается, освобождается используемая им память. После закрытия курсор уже не содержит результирующее множество. В некоторых случаях явное закрытие курсора не требуется, ядро PL/SQL само выполняет эту операцию (например, для неявных курсоров или встроенного динамического SQL).
PL/SQL поддерживает ряд атрибутов курсоров, которые можно применять для получения информации о состоянии курсора (табл. 1.5). При попытке ссылки на один из этих атрибутов для курсора, который еще не был открыт, Oracle обычно инициирует исключение INVALID_ CURSOR.
Таблица 1.5. Атрибуты курсоров
Имя
|
Описание
|
%FOUND
|
|
%NOTFOUND
|
|
%ROWCOUNT
|
Имя
|
Описание
|
%ISOPEN
|
FALSE.
|
%BULK_ROWCOUNT
|
|
%BULK_EXCEPTIONS
|
Чтобы сослаться на атрибут курсора, укажите его после имени курсора или курсорной переменной, информацию о которых необходимо получить. Рассмотрим несколько примеров.
• Открыт ли все еще явный курсор?
• Сколько строк было извлечено неявным пакетным запросом? (Обратите внимание, что «именем» курсора в данном случае является «SQL».)
Вы можете ссылаться на атрибуты курсора в PL/SQL-коде (как это показано в примерах), но не можете использовать эти атрибуты внутри оператора SQL. Например, если бы вы попытались использовать атрибут %ROWCOUNT в предложении WHERE оператора SELECT, то результат был бы таким:
< Предыдущая | Следующая > |
---|