Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD.doc
Скачиваний:
9
Добавлен:
22.04.2019
Размер:
507.9 Кб
Скачать
  1. Курсоры, явные и неявные курсоры, операторы работы с курсором, оператор select into.

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

SELECT … INTO … - когда возвращается 1 строка

BEGIN

SELECT id, customerid, orderdate

INTO currentorder.id, currentorder.customerid,

currentorder.orderdate

FROM orders

WHERE id=453;

Если по запросу возвращаются несколько строк, нужно воспользоваться курсором.

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

В одних случаях курсоры объявляются явно, а других программист предоставляет PL/SQL самому выполнить эту операцию.

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

CURSOR имя_курсора [(параметр_1 [, параметр_2, ...])]

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

IS

оператор_SELECT

[FOR UPDATE

[OF таблица_или_столбец_1

[, таблица_или_столбец_2, ...]

]

]

Параметры курсора являются входными (IN). Значения переданных параметров могут использоваться в разделе WHERE связанного с курсором оператора SELECT.

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

Команды insert, update или delete здесь не допускаются. Явные курсоры используются для обработки тех операторов, которые возвращают более одной строки.

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

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

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

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

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

Использование команд OPEN, FETCH и CLOSE

В момент открытия оператором OPEN курсор выполняет связанный с ним оператор SELECT. Если оператор SELECT возвращает непустой набор записей курсор автоматически указывает на первую выбранную строку.

Каждая команда FETCH перемещает данные из курсора в указанные переменные, после чего перемещает указатель на следующую запись в наборе записей, возвращенным оператором SELECT. Если записей больше нет, указатель все время будет указывать на последню запись, а атрибуты курсора %FOUND и %NOTFOUND становятся равными, соответственно, FALSE и TRUE.

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

Атрибуты курсора:

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

Атрибут

Описание

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

Позволяет проверить, открыт ли курсор. Если курсор имя_курсора уже открыт, возвращается значение TRUE.

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

Порядковый номер строки в наборе данных, на которую указывает курсор.

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

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

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

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

Перед тем, как попытаться выбрать из курсора очередные данные, следует проверить состояние атрибутов %FOUND или %NOTFOUND.

Неявно объявляемые курсоры

Оператор select указывается в теле блока, и PL/SQL берет на себя всю заботу об определении курсора, выполняя соответствующие действия неявно. При этом программисту не требуется вносить в секцию DECLARE никаких дополнительных объявлений.

Обработка неявных курсоров

Каждый оператор select выполняется в пределах контекстной области и поэтому имеет курсор, указывающий на конкретную контекстную область. Такой курсор называется SQL-курсором. В отличии от явных курсоров SQL-курсор не открывается и не закрывается программой. PL/SQL неявно открывает SQL-курсор, обрабатывает SQL- оператор и в последствии закрывает этот курсор, поэтому команды OPEN, FETCH, CLOSE не нужны.

Неявные курсоры используются для обработки операторов INSERT, UPDATE, DELETE, а также однострочных операторов SELECT…INTO

Фактическая обработка записей из курсора обычно выполняется внутри цикла. При написании такого цикла обычно производится проверка, была ли найдена хотя бы одна запись. Если да, то можно продолжить обработку этой записи; в противном случае следует выйти из цикла. Пример:

set serveroutput on

DECLARE

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

CURSOR showmanagers IS

select * from managers;

-- объявление временной переменной для хранения текущей строки курсора

m managers%ROWTYPE;

BEGIN

-- открытие курсора

OPEN showmanagers;

-- выборка первой записи

FETCH showmanagers INTO m;

-- продолжать цикл до тех пор, пока курсор указывает на необработанную запись

WHILE showmanagers%FOUND LOOP

dbms_output.put_line(to_char(showmanagers%ROWCOUNT)||` `||m.name);

-- выбрать следующую запись

FETCH showmanagers INTO m;

END LOOP;

END;

/

Приведенный пример выводит на экран пронумерованный список имен менеджеров.

Курсорный цикл FOR

Приведенный выше пример можно реализовать другим, более кратким путем, используя курсорный цикл FOR. При этом PL/SQL будет осуществлять открытие, выборку и закрытие курсора без вашего участия.

Синтаксис курсорного цикла FOR имеет следующий вид:

FOR запись_курсора IN имя_курсора[(параметр_1 [, параметр_2 ...])] LOOP

операторы;

END LOOP;

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

DECLARE

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

CURSOR showmanagers IS

select * from managers;

BEGIN

FOR m IN showmanagers LOOP

dbms_output.put_line(to_char(showmanagers%ROWCOUNT)||` `||m.name);

END LOOP;

END;

/

Данный пример делает то же, что и предыдущий, но даже на первый взгляд видно, что он значительно короче и проще. Уже не нужно объявлять переменную для временного хранения текущей строки курсора. Не надо открывать или закрывать курсор.

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