Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Работа с Oracle / 19 - Курсоры в PL SQL.ppt
Скачиваний:
8
Добавлен:
28.06.2021
Размер:
387.07 Кб
Скачать

Использование курсоров в PL/SQL

Понятие курсора Явные курсоры Курсорные циклы

Задача, требующая применения курсора

Записать в новую таблицу FEVRAL все заказы, сделанные в феврале 2009 г. Предварительно нужно создать новую пустую таблицу со структурой, аналогичной структуре таблицы Orders.

SELECT * FROM Orders

WHERE TRUNC (o_time) BETWEEN '01-FEB-2009' AND '28-FEB-2009';

Попытки решения

CREATE OR REPLACE PROCEDURE ord_fevr IS BEGIN

SELECT * FROM Orders

WHERE TRUNC (o_time)

BETWEEN '01-FEB-2009' AND '28-FEB-2009'; END ord_fevr;

/

Error(4,1): PLS-00428: an INTO clause is expected in this SELECT statement

Попытки решения

CREATE OR REPLACE PROCEDURE ORD_FEVR IS orderID NUMBER ;

userID NUMBER ; bookID NUMBER ; tim TIMESTAMP ; num NUMBER ;

BEGIN

SELECT * INTO orderID, userID, bookID, tim, num FROM Orders

WHERE TRUNC(o_time) BETWEEN '01-FEB-2009' AND '28-FEB-2009';

END ord_fevr;

Попытки решения

EXECUTE ord_fevr;

Курсор

Курсор (текущий набор записей) — важная конструкция PL/SQL, лежащая в основе взаимодействия PL/SQL и SQL.

Специальный элемент PL/SQL, с которым связан SQL-опе- ратор SELECT.

Объявляется в секции объявлений базового блока. Откры- вается командой OPEN, выборка строк осуществляется с помощью команды FETCH.

После завершения всей обработки закрывается командой CLOSE. Закрытие курсора освобождает системные ресурсы, которые использовались, пока он был открыт.

Курсоры

Для SQL-операторов, используемых в коде PL/SQL, применяются:

явные (explicit) курсоры (те, которым присвоено имя).

неявные или скрытые (implicit) курсоры.

Пример процедуры с явным курсором (1)

CREATE OR REPLACE PROCEDURE ord_fevr IS orderID NUMBER ;

userID NUMBER ; bookID NUMBER ; tim TIMESTAMP ; num NUMBER ;

CURSOR fev_cur IS

SELECT * FROM Orders

WHERE TRUNC (o_time)

BETWEEN '01-FEB-2009' AND '28-FEB-2009';

Пример процедуры с явным курсором (2)

BEGIN

OPEN fev_cur ;

FETCH fev_cur INTO orderID, userID, bookID, tim, num ; WHILE fev_cur%FOUND LOOP

dbms_output.put_line (orderID ||' '|| userID ||' '|| bookID || '

'|| tim ||' '|| num);

INSERT INTO fevral VALUES(orderID, userID, bookID, tim, num);

FETCH fev_cur INTO orderID, userID, bookID, tim, num; END LOOP;

CLOSE fev_cur; END ord_fevr;

Пример процедуры с явным курсором (3)