Выборка данных в PL/SQL, страница 3

Курсор можно объявить на уровне пакета.

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