Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СУБД Oracle / Лекции / Лек_ORAC / L45 / Основы языка PL_SQL.doc
Скачиваний:
69
Добавлен:
16.04.2013
Размер:
120.32 Кб
Скачать

If sql%notfoundthen

Insert into tb_error_log(id,date)

Values (user_id, sysdate);

END IF;

END;

Пояснения атрибутов неявных курсоров.

SQL%ISOPEN– Всегда возвращаетTRUE, поскольку курсор закрывается автоматически сразу после выполнения инструкции.

SQL%FOUND – Перед выполнением инструкции возвращаетNULL. Если хотя бы одна строка была вставлена или изменена, то возвращаетTRUE, иначе возвращаетFALSE.

SQL%NOTFOUND – Перед выполнением инструкции возвращаетNULL. Если хотя бы одна строка была вставлена или изменена, то возвращаетFALSE, иначе возвращаетTRUE.

SQL%ROWCOUNT – Возвращает количество строк, обработанных курсором.

SQL%BULK_ROWCOUNT – Возвращает ассоциативный псевдомассив, содержащий количество строк, которые обработаны инструкциями, выполненными в операциях пакетного связывания (относится к операциям с коллекциями).

Объявление переменной типа курсора.

Синтаксис:

TYPE имя_переменной_курсора IS REF CURSOR

[RETURN тип_записи]

Объявление, содержащее предложение RETURNзадаётсильно-типизированнуюпеременную. Её можно связывать во время выполнения только с запросами возвращающими набор, соответствующий типу записи, указанному в предложенииRETURN.

Объявление без RETURNзадаётслаботипизированнуюпеременную. Её можно связывать во время выполнения с любым запросом.

Примеры:

-- Задаём тип курсора на основе таблицы companies

TYPE cur_company_type IS REF CURSOR

RETURN companies%ROWTYPE;

-- Объявление сильнотипизированной переменной курсора

company_cur cur_company_type;

-- Задаём слаботипизированный тип курсора

TYPE cur_any_type IS REF CURSOR;

-- Объявление слаботипизированной переменной курсора

product_cur cur_any_type;

Курсор, связанный с переменной курсора, открывается специфической инструкцией OPEN:

OPEN имя_переменной_курсора FOR инструкция_SELECT;

А синтаксис инструкций FETCHиCLOSEостаётся таким же.

Ограничение на использование курсорных переменных:

  • Переменной курсора нельзя присваивать значение NULL

  • Нельзя проверять её с помощью операторов сравнения на равенство или неравенство какому-либо значению

  • Переменные курсора нельзя хранить в столбцах базы данных и в коллекциях

  • Переменные курсора нельзя объявлять на уровне пакета (поскольку они не имеют устойчивого состояния). В пакете их можно объявлять только на уровне процедур и функций.

  • Переменные курсора нельзя передавать между серверами механиз­мом RPC(RemoteProcedureCall– удалённый вызов процедур).

Пример использования курсорной переменной:

DECLARE

TYPE cv_typ IS REF CURSOR; -- Объявление типа

cv cv_typ; -- Объявление курсорной переменной

V_account_no number;

V_balance number;

BEGIN

OPEN cv FOR -- Открытие курсора cv

SELECT v_account_no, v_balance

FROM accounts

WHERE v_balance<50’;

LOOP -- Цикл выборки строк из курсора

FETCH cv INTO v_account_no, v_balance

EXIT WHEN cv%NOTFOUND;

. . . -- Обработка строки

END LOOP;

CLOSE cv;

END;

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

Курсорное выражение.

Это курсор, который используется в качестве выражения в списке столбцов инструкции SELECTявного курсора. Синтаксис:

CURSOR(вложенный_запрос)

Пример.

DECLARE

TYPE ref_cursor IS REF CURSOR;

CURSOR order_cur IS

SELECT o.order_date, o.order_status,

CURSOR(SELECT p.tratslated_name,

Соседние файлы в папке L45