- •Основы языка 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;
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,