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

15.Курсоры , их атрибуты. Использования цикла for при работе с курсорами.

Конструкция PL/SQL, называемая курсором, позволяет дать имя некоторой рабочей области, данные в которую будут помещаться операторами SQL. Имеются 2 типа курсоров: неявные и явные. PL/SQL неявно объявляет курсор для всех DML–утверждений языка SQL, включая запросы, возвращающие ровно одну строку.

Курсор может быть явно объявлен с помощью оператора

DECLARE

CURSOR имякурсора [(параметрыкурсора)]IS операторSelect;

Имя курсора - это необъявленный ранее идентификатор, а не переменная PL/SQL; его можно использовать только для обращения к запросу. Нельзя присваивать значений имени курсора или использовать его в выражениях.

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

После объявления курсора над ним можно выполнять следующие операции:

  • открытие (OPEN). Открытие курсора предложением OPEN исполняет предложение SELECT и идентифицирует активное множество, т.е. все строки, удовлетворяющие поисковым условиям запроса

  • выбор очередной строки (FETCH). Предложение FETCH извлекает очередную строку из активного множества. При каждом выполнении FETCH курсор продвигается к следующей строке в активном множестве. Рассмотрим формат предложения FETCH:

FETCH имякурсора INTO списокпеременных;

  • закрытие курсора (CLOSE). Предложение CLOSE деактивирует курсор, и активное множество становится неопределенным.

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

Каждый курсор, явно объявленный , имеет четыре атрибута: %NOTFOUND, %FOUND, %ROWCOUNT и %ISOPEN.

Использование %NOTFOUND. Когда курсор открыт, строки, удовлетворяющие ассоциированному запросу, идентифицированы и образуют активное множество. Эти строки извлекаются операцией FETCH по одной за раз. Если последняя операция FETCH вернула строку, %NOTFOUND дает FALSE. Если последняя операция FETCH не смогла вернуть строку (так как активное множество исчерпано), %NOTFOUND дает TRUE. Операция FETCH должна в конце концов исчерпать активное множество, так что, когда это происходит, никакого исключения не возбуждается.

Использование %FOUND. %FOUND логически противоположен атрибуту %NOTFOUND. После открытия явного курсора, но до первой операции FETCH, %FOUND дает NULL. Впоследствии он дает TRUE, если последняя операция FETCH вернула строку, или FALSE, если последняя операция FETCH не смогла извлечь строку, так как больше нет доступных строк.

Использование %ROWCOUNT. Когда вы открываете курсор, его атрибут %ROWCOUNT обнуляется. Перед первой операцией FETCH %ROWCOUNT возвращает 0. Впоследствии, %ROWCOUNT возвращает число строк, извлеченных операциями FETCH из активного множества на данный момент. Это число увеличивается, если последняя операция FETCH вернула строку.

Использование %ISOPEN. %ISOPEN дает TRUE, если явный курсор открыт, и FALSE в противном случае.

Атрибуты неявных курсоров

Oracle неявно открывает курсор для обработки каждого предложения SQL, не ассоциированного с явно объявленным курсором. PL/SQL позволяет обращаться к последнему открытому неявному курсору через имя "SQL".

Как и явный, неявный курсор SQL имеет атрибуты %NOTFOUND, %FOUND, %ROWCOUNT . Эти атрибуты, присоединяемые к имени курсора ("SQL"), дают доступ к информации о выполнении предложений INSERT, UPDATE, DELETE и однострочных предложений SELECT INTO. Использовать атрибуты неявного курсора можно только в процедурных предложениях, но не в предложениях SQL. Пока ORACLE автоматически не открыл неявный курсор, т.е. не выполнил оператор SQL, все его атрибуты возвращают NULL.

Работа с атрибутами неявного курсора подобна работе с явными курсорами, за исключением атрибутов для оператора SELECT. В блоках PL/SQL оператор SELECT может применяться только в форме SELECT … INTO, предусматривающей возврат ровно одной строки. Если возвращаемое число строк не равно единице, возбуждается исключение. Так, если предложение SELECT … INTO не возвращает ни одной строки, возбуждается предопределенное исключение NO_DATA_FOUND, независимо от того, проверяете ли вы %NOTFOUND в следующей строке или нет. Однако, предложение SELECT … INTO, использующее вызов групповой функции SQL, никогда не возбуждает исключение NO_DATA_FOUND. ,если предложение SELECT … INTO возвращает более одной строки, возбуждается предопределенное исключение TOO_MANY_ROWS. Значение атрибута %ROWCOUNT при этом остается равным 1.

Использование цикла FOR для работы с курсорами

В большинстве ситуаций, требующих использования курсора, вы можете использовать курсорный цикл FOR, чтобы упростить кодирование. Курсорный цикл FOR -неявно объявляет свой индекс цикла как запись типа %ROWTYPE;

  • открывает курсор;

  • в цикле извлекает строки из активного множества в поля записи;

  • закрывает курсор, когда все строки обработаны или когда вы выходите из цикла (в том числе и принудительно, с помощью EXIT или GOTO, или когда внутри цикла возбуждается исключение).

Как и в других циклах FOR, область видимости переменной - индекса цикла ограничена этим циклом.

Формат цикла FOR для работы с курсорами следующий:

FOR индексцикла IN курсор | операторSELECT LOOP

END LOOP

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