Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Answers v.0.6.docx
Скачиваний:
6
Добавлен:
26.09.2019
Размер:
244.13 Кб
Скачать

11. Курсоры, операторы работы с курсором, оператор select into.

В зависимости от числа строк, возвращаемых запросом, используется один из методов.

  1. Когда возвращ. 1 строка — Select … into … . #:

Select OrderDate into ResultDate from Orders

Where Order_ID=453;

  1. Когда возвращ. 1 или больше строк — курсор.

Курсор — указатель на набор записей, полученный в результате выполнения связанного с ним оператора Select. Назначение: выполнение и обработка запросов, возвращающих более одной строки.

Курсоры могут объявляться явно и неявно.

Курсор, как и переменная, объявляется в секции объявлений базового блока. Синтаксис:

Cursor <имя_курсора> [(<параметр1> [,<параметр2>, …])]

[Return <спецификация_возврата>]

is

Select

[for Update

[of <таблица_или_столбец1>

[, <таблица_или_столбец2>, …]

]

]

Параметры курсора явл. входными. Значения переданных параметров могут исп. в разделе Where связанного с курсором оператора Select.

Явное объявление курсора производится в секции Declare, причем указанный в определении SQL-оператор может содержать команды Select.

Команды Insert, Update, Delete здесь не допускаются. Явные курсоры используются для обработки операторов, кот. возвращают более 1 строки.

Для обработки явного курсора в PL/SQL необходимо выполнить 4 шага:

  • объявление курсора;

  • открытик курсора оператором Open;

  • выборка данных оператором Fetch;

  • закрытие курсора оператором Close;

При открытии оператором Open курсор выполняет связанный с ним оператор Select. Если он возвращает непустой набор записей, курсор автоматически указывает на первую строку в наборе.

Каждая команда Fetch перемещает данные из курсора в указанные переменные, после чего перемещает указатель на следующую запись в наборе записей, возвращенным оператором Select. Если записей больше нет, указатель все время будет указывать на последнюю запись, а атрибуты курсора %Found и %NotFound становятся равными, соответственно, False и True соответственно.

При выполнении оператора Close курсор закрывается. При этом освобождаются все ресурсы, занятые во время открытия курсора.

Курсор имеет ряд индикаторов, показывающих его состояние. Они называются атрибутами курсора.

имя_курсора%IsOpen

Проверяет, открыт ли курсор. Возвращается значение True, если открыт.

имя_курсора%RowCount

Номер строки в наборе данных, на кот. указ. курсор.

имя_курсора%Found

Проверяет, была ли успешной последняя попытка получения записи из курсора. Если успешна, возвращ. True.

имя_курсора%NotFound

Противоположен атрибуту Found. Если записей больше не найдено, возвращ. True.

Неявные курсоры используются для обработки операторов Insert, Update, Delete, а также однострочных операторов Select … into.

Оператор Select указывается в теле блока, и PL/SQL берет на себя всю заботу об определении курсора, выполняя соответствующие действия неявно.

Каждый оператор Select имеет курсор, указ. на конкретную контекстную область, т. к. выполняется в пределах контекстной области. Такой курсор называется SQL-курсором. Он неявно открывается, обрабатывается SQL-оператор и закрывается, поэтому команды Open, Fetch, Close не нужны.

Обработка записей из курсора обычно выполняется в цикле. При написании такого цикла обычно производится проверка, была ли найдена хотя бы одна запись (проверяется состояние атрибутов %Found или %NotFound). Если да, то можно продолжить ее обработку. Иначе следует выйти из цикла.

# вывода пронумерованного списка менеджеров:

Declare

Cursor ShowMng is — Объявление курсора.

Select * from managers;

m Managers%RowType; — Объявление временной переменной для хранения текущей строки курсора.

Begin

Open ShowMng; — Открытие курсора.

Fetch ShowMng into m; — Выборка первой записи.

While ShowMng%Found Loop — Продолжать цикл, пока курсор указывает на необработанную запись.

dbms_output.put_line(to_char(ShowMng%RowCount)||’ ’||m.Name);

Fetch ShowMng into m; — Выбрать след. запись.

End Loop; — Конец цикла.

Close ShowMng; — Закрытие курсора.

End; — Конец блока (курсора).

Этот # можно реализовать, используя курсорный цикл For. При этом открытие, выборка и закрытие курсора будет происходить без участия пользователя.

Синтаксис курсорного цикла For:

For <запись_курсора> in <имя_курсора> [(<параметр1> [, <параметр2>,…])] Loop

<операторы>;

End Loop;

Этот цикл выбирает записи из курсора в переменную запись_курсора. Поля записи_курсора можно использовать для доступа к данным из операторов PL/SQL, выполняемых в цикле. Когда все записи выбраны, цикл завершается.

Declare

Cursor ShowMng is

Select * from Managers;

Begin

For m in ShowMng Loop

dbms_output.put_line(to_char(ShowMng%RowCount)||’ ’||m.Name);

End Loop;

End;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]