Знакомство с языком PL/SQL и его управляющими конструкциями  
 
 МЕТОДИЧЕСКИЕ УКАЗАНИЯ
 Главная|   О курсе|   Содержание

 

Курсоры.

 

Курсор – объект, обеспечивающий операции на уровне строк предложения языка 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: выбранная строка остается текущей, пока не будет выбрана следующая. Выбор строк производится только в прямом направлении.

Пример:

  1. Выборка всех записей из таблицы.
  2. CURSOR get_order IS SELECT * FROM orders;

  3. Выборка некоторых столбцов для одного заказа.
  4. CURSOR get_orders_1 (p_ord_num orders.ord_num %TYPE) IS
    SELECT <имена столбцов> FROM orders WHERE ord_num = p_ord_num;

  5. Получение полной строки для определения номера
  6. CURSOR get_items (p_item_no items.item_no %TYPE) IS SELECT * FROM items   WHERE     item.no=p_item_no; RETUN items % ROWTYPE;

  7. Выборка строк возвращается значение одного столбца

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;

 

При этом, если функция поиска в неявном курсоре возвратит больше одной строки, то будет выдана ошибка. Если необходимо получить одну строку, то эффективнее применять явный курсор.


 Главная|   О курсе|   Содержание