DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Явные курсоры

Вы можете явно объявить курсор в разделе объявлений (локального блока или пакета). В этом случае курсор можно будет открывать и извлекать данные в одной или нескольких программах, причем возможности контроля будут шире, чем при использовании неявных курсоров.
Курсорные переменные
Дополнительный уровень гибкости обеспечивают курсорные переменные (объявленные на основе типа 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).
Исполнение
На этапе исполнения оператор выполняется внутри ядра SQL. Выборка
При выполнении запроса команда FETCH извлекает следующую строку из результирующего множества курсора. При каждой выборке PL/SQL передвигает курсор вперед на одну строку по результирующему множеству. При работе с явными курсорами следует помнить, что в случае, когда строк для извлечения больше нет, FETCH ничего не делает (не инициирует исключение).
Закрытие
На этом этапе курсор закрывается, освобождается используемая им память. После закрытия курсор уже не содержит результирующее множество. В некоторых случаях явное закрытие курсора не требуется, ядро PL/SQL само выполняет эту операцию (например, для неявных курсоров или встроенного динамического SQL).
Атрибуты курсоров
PL/SQL поддерживает ряд атрибутов курсоров, которые можно применять для получения информации о состоянии курсора (табл. 1.5). При попытке ссылки на один из этих атрибутов для курсора, который еще не был открыт, Oracle обычно инициирует исключение INVALID_ CURSOR.
Таблица 1.5. Атрибуты курсоров
Имя
Описание
%FOUND
Возвращает TRUE, если данные были выбраны, в противном случае - FALSE.
%NOTFOUND
Возвращает TRUE, если не выбрано ни одной строки, в про­тивном случае - FALSE.
%ROWCOUNT
Возвращает количество строк, выбранных из курсора на те­кущий момент времени.

Имя
Описание
%ISOPEN
Возвращает TRUE, если курсор открыт, в противном случае -
FALSE.
%BULK_ROWCOUNT
Возвращает количество строк, измененных командой FORALL, для каждого элемента коллекции.
%BULK_EXCEPTIONS
Возвращает информацию об исключении для строк, изме­ненных командой FORALL, для каждого элемента коллекции.

Чтобы сослаться на атрибут курсора, укажите его после имени курсора или курсорной переменной, информацию о которых необходимо получить. Рассмотрим несколько примеров.
• Открыт ли все еще явный курсор?

• Сколько строк было извлечено неявным пакетным запросом? (Обратите внимание, что «именем» курсора в данном случае является «SQL».)


Вы можете ссылаться на атрибуты курсора в PL/SQL-коде (как это показано в примерах), но не можете использовать эти атрибуты внутри оператора SQL. Например, если бы вы попытались использовать атрибут %ROWCOUNT в предложении WHERE оператора SELECT, то результат был бы таким:
 









jAntivirus