Курсоры.
Курсор – объект, обеспечивающий операции на уровне строк предложения языка PL/SQL.
Объявление курсора – указатель на область памяти, которая используется при применении курсора.
Курсор может быть любым допустимым предложением SELECT языка PL/SQL. Обычно курсор – основной блок предложений языка PL/SQL.
Они обеспечивают цикличный механизм оперирования данными в базе, при этом возможно обновление данных с помощью FOR UPDATE.
При использовании FOR UPDATE осуществляется блокировка всех строк, участвующих в запросе, она сохраняется до закрытия курсора. Курсор может возвращать: одну строку, массив строк, или пустое значение.
Определение курсора:
CURSOR <имя> IS < оператор SQL>
Пример:DECLARE
CURSOR get_order IS SELECT * FROM orders;
Определение и использование курсоров
2 основных подхода для работы с курсорами:
1. Курсору можно передать параметры. Параметры задаются в момент открытия курсора.
2. Можно определять или не определять тип возвращаемого значения. Возможный тип: указанная запись, строка БД, отдельная переменная.
В любом случае, столбцы, определяемые в SELECT, должны совпадать с используемой для получения возвращаемых значений структурой данных.
После объявления курсор может быть открыт, строки выбраны, состояние проверено и он может быть закрыт. Курсор может иметь любое имя, рекомендуется использовать префикс get_ или постфиксы _cur, _loop.
В имени курсора рекомендуется использовать имя таблицы или как-то по-другому ссылаться на нее.
Список параметров только принимает значения, но не возвращает их. Входные параметры открытия курсора: вычисляется SQL- код и вычисляется соответствующий набор данных, но строки набора программе не возвращаются. Чтобы получить строки одну за другой используется оператор FETCH: выбранная строка остается текущей, пока не будет выбрана следующая. Выбор строк производится только в прямом направлении.
Пример:
- Выборка всех записей из таблицы.
CURSOR get_order IS SELECT * FROM orders;
- Выборка некоторых столбцов для одного заказа.
CURSOR get_orders_1 (p_ord_num orders.ord_num %TYPE) IS
SELECT <имена столбцов> FROM orders WHERE ord_num = p_ord_num;
- Получение полной строки для определения номера
CURSOR get_items (p_item_no items.item_no %TYPE) IS SELECT * FROM items WHERE item.no=p_item_no; RETUN items % ROWTYPE;
- Выборка строк возвращается значение одного столбца
CURSOR get_items_1 (p_item_no items.item_no %TYPE) RETUN items.item_name % TYPE IS SELECT item_name FROM items WHERE item.no=p_item_no;
Возвращается таблица из одной записи с одним полем
Методы курсора
Метод |
Возвращаемое значение |
Описание |
IS OPEN |
True/false |
Открыт ли курсор |
FOUND |
True/false |
True, если строка найдена |
NOTFOUND |
True/false |
True, если строка не найдена |
ROWCOUNT |
NUMBER |
Порядковый номер полученной строки (начиная с 1 |
Пример:
IF orders_cur % FOUND THEN
OPEN items_cur (orders_cur.order_no),
LOOP
EXIT WHEN items_cur % NOTFOUND;
<…>
END LOOP;
END IF;
Пример: IF items_cur % ISOPEN THEN CLOSE items_cur;
END IF;
Циклическая обработка курсоров
Простейший способ использования – циклы FOR. При этом открытие, выборка и закрытие курсора происходит автоматически в области видимости цикла FOR.
Возвращаемая переменная – строка определяется неявно, на нее нельзя сослаться вне области цикла. Курсор может принимать параметры. Допускается объявление курсора в разделе DECLARE или в теле цикла.
Использование неявных курсоров
Предназначены для получения первой строки, если же будут найдены несколько строк, следовательно должна произойти обработка исключений (exception TOO_MANY_ROWS). Если в SELECT организовать чтение в переменную типа столбца, то это будет неявный курсор.
Пример:
DECLARE
get_tables_rec all_tables%ROWTYPE;
local_owner all_tables.owner%TYPE:=”DEMO”;
local_table all_tables.name%TYPE:=”COSTOMER”;
BEGIN
SELECT * INTO get_tables_rec FROM all_tables WHERE owner=local.owner AND name=local.table;
<действия>
END;
При этом, если функция поиска в неявном курсоре возвратит больше одной строки, то будет выдана ошибка. Если необходимо получить одну строку, то эффективнее применять явный курсор.