
- •Основы языка pl/sql
- •Основные синтаксические конструкции языка pl/sql
- •V_ename emp.Ename%type;
- •V_sal number;
- •Курсоры pl/sql
- •V_ename emp.Ename%type;
- •V_sal emp.Sal%type;
- •If sql%notfoundthen
- •Insert into tb_error_log(id,date)
- •Values (user_id, sysdate);
- •V_account_no number;
- •V_balance number;
- •I.Until_price,
- •I.Quantity
- •Управление ходом выполнения кода pl/sql
- •If условие then операторы;
- •V_ename emp.Ename%type;
- •V_sal emp.Sal%type;
- •If c_emp%found then
- •Обработка ошибок (исключений - exception)
- •V_oraerr number;
- •V_oraerrm varchar2(255);
- •V_sal number;
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;