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

V_ename emp.Ename%type;

V_sal number;

BEGIN

SELECT * INTO emp_record

FROM emp

WHERE empno = 7369;

v_ename := emp_record.ename;

v_sal := emp_record.sal;

END; -- Procedure Test

SQL>VARIABLE g_raise NUMBER;

SQL>

SQL>DECLARE

2 v_sal NUMBER := 1000;

3 BEGIN

4 :g_raise := v_sal * 1.2;

5 END;

PL/SQL procedure successfully complieted.

SQL>PRINT g_raise

G_RAISE

---------

1200

SQL>

Курсоры pl/sql

(CURSOR)

Бывают явные(explicit) инеявные(implicit).

Неявный курсор формируется при выполнении оператора SQL, не имеющего явных средств управления курсором (как, например выше в процедуреTEST).

Явный курсор определяется в процедуре так:

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

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

IS

оператор SELECT

[FOR UPDATE

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

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

] [NOWAIT]

]

  • Параметры курсора всегда входные

  • Курсор объявляется в секции объявлений

  • Должен быть открыт командой OPEN

  • Выборка очередной строки курсора делается командой FETCH

  • Закрывается командой CLOSE(если его не закрыть, то не освобождаются системные ресурсы курсора)

-- Блок-схема применения явного курсора --

Примечание. КонструкцияRETURNиспользуется вместо оператораSELECTпри описании курсора в спецификации пакета, при этом собственно определение курсора должно быть в теле пакета.

Пример описания курсора в спецификации пакета.

CURSOR c_prod (v_id IN NUMBER)

RETURN product%ROWTYPE;

Примечание. КонструкцияFORUPDATEпозволяет заблокировать данные с момента открытия курсора, а не с момента вызова инструкции модификации.

Примечание. КонструкцияNOWAITпозволяет не ждать снятия блокировки другим сеансом.

Пример явного курсора

Procedure TEST1

IS

CURSOR c_emp IS

SELECT ename, sal FROM emp;

V_ename emp.Ename%type;

V_sal emp.Sal%type;

BEGIN

OPEN c_emp;

FETCH c_emp INTO v_ename, v_sal;

CLOSE c_emp;

END; -- Proc TEST1

Синтаксис.

OPEN имя_курсора [ (список_параметров) ]

Причём, список параметров бывает только тогда, когда он был задан в определении курсора.

CLOSE имя_курсора

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

Перед выборкой очередной записи из курсора, следует проверить через атрибуты (в виде имя_курсора%атрибут) есть ли ещё записи в курсоре. Атрибуты курсора:

  • %ISOPEN=TRUE– если курсор открыт

  • %NOTFOUND=TRUE– если не получена строка, обусловленная запросом

  • %FOUND=TRUE– если получена строка, обусловленная запросом

  • %ROWCOUNT– содержит число возвращенных строк

Логично организовать выборку записи как «Курсорный цикл»:

FOR запись_курсора IN имя_курсора LOOP

операторы;

END LOOP;

Конструкция “WHERE CURRENT OF имя_курсора

Может быть добавлена при обработке строки курсора, к оператору UPDATE, либоDELETE.

Пример.

DECLARE

CURSOR product_cur IS

SELECT * FROM product_tab

FOR UPDATE OF product_price;

BEGIN

FOR product_rec IN product_cur

LOOP

UPDATE product_tab

SET product_price = (product_rec.product_price * 0.97)

WHERE CURRENT OF product_cur;

END LOOP;

END;

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

Неявные курсоры. Формируются при использованииSQL-командINSERT,UPDATE,DELETE,MERGEиSELECTINTO.

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

Неявные курсоры, в отличие от явных, не объявляются и не нуждаются в применении OPEN,CLOSEиFETCH, однако, для них существуют атрибуты курсора с именем курсораSQL. Например:

BEGIN

UPDATE tb_reports SET last_date:=SYSDATE

WHERE uid = user_id;

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