Курсор можно объявить на уровне пакета.
CREATE OR REPLACE PACKAGE pack_utl IS
CURSOR c_sal IS
SELECT sname FROM sal;
END;
При объявлении курсора в пакете можно отделить заголовок курсора от его тела.
CREATE OR REPLACE PACKAGE pack_utl IS
CURSOR c_sal (p_SNum sal.snum%TYPE)
RETURN sal%ROWTYPE;
END;
CREATE OR REPLACE PACKAGE BODY pack_utl IS
CURSOR c_sal (p_SNum sal.snum%TYPE)
RETURN sal%ROWTYPE
IS
SELECT * FROM sal WHERE snum = p_SNum;
END;
· Сокрытие информации
· Минимизация перекомпиляций
2.2. Открытие явного курсора
OPEN имя_курсора [(аргумент [, аргумент …])];
Оператор OPEN выполняет содержащийся в курсоре запрос. Он формирует результирующий набор строк, но не извлекает данные – это делает оператор FETCH.
IF NOT c_sal%ISOPEN THEN
OPEN c_sal;
END IF;
2.3. Выборка данных из явного курсора
FETCHимя_курсораINTO запись_или_список_переменных;
· Выборка данных из курсора в запись
DECLARE
CURSOR c_ord IS
SELECT * FROM ord;
ord_rec ord%ROWTYPE;
BEGIN
OPEN c_ord;
FETCH c_ord INTO ord_rec;
· Выборка данных из курсора в переменную
DECLARE
CURSOR c_ord IS
SELECT odate FROM ord;
ord_date ord.odate%TYPE;
BEGIN
OPEN c_ord;
FETCH c_ord INTO ord_date;
Псевдоним столбца – это альтернативное имя в инструкции SELECT для столбца или выражения. Для явного курсора псевдонимы столбцов необходимы:
· когда данные выбираются из курсора в запись, объявленную с атрибутом %ROWTYPE на основе того же курсора;
· когда в программе имеется ссылка на вычисляемый столбец.
DECLARE
CURSOR c_ord IS
SELECT odate, SUM(amt) amt_sum FROM ord GROUP BY odate;
ord_rec c_ord %ROWTYPE;
BEGIN
OPEN c_ord;
LOOP
FETCH c_ord INTO ord_rec;
EXIT WHEN c_ord%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(to_char(ord_rec.odate,’dd.mm.yyyy’))||
‘ ’|| ord_rec. amt_sum);
END LOOP;
END;
2.4. Закрытие явного курсора
CLOSE имя_курсора;
· Если курсор объявлен и открыт в процедуре, следует его закрыть после завершения работы с ним. Иначе возможна «утечка памяти»
· Курсор, объявленный в пакете, следует сразу же закрыть после завершения работы с ним, т.к. он остается открытым до явного закрытия или до конца сеанса
· Важно как можно раньше закрывать курсор с запросом SELECTFORUPDATE, т.к. для таких запросов происходит блокировка выбираемых строк
· Курсор следует закрывать только в том случае, если он открыт
IF c_sal%ISOPEN THEN
CLOSE c_sal;
END IF;
· Если оставить открытыми много курсоров, можно превысить значение параметра базы данных OPEN_CURSORS. Появится сообщение об ошибке:
ORA-01000: maximum open cursors exceeded
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.