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

Курсорная переменная предоставляет программисту новые возможности:

·  может быть связана с разными запросами по ходу выполнения программы

·  может быть передана в качестве аргумента процедуре или функции

·  значение одной курсорной переменной может быть присвоено другой курсорной переменной

2.8.1. Объявление типов REF CURSOR

TYPE имя_типа_курсора IS REF CURSOR [ RETURN возвращаемый_тип ];

TYPE sal_curtype IS REF CURSOR  RETURN sal%ROWTYPE;

TYPE cust_curtype IS REF CURSOR;

2.8.2. Объявление курсорной переменной

имя_курсорной переменной   имя_типа_курсора ;

DECLARE

TYPE sal_curtype IS REF CURSOR  RETURN sal%ROWTYPE;

cv_salsal_curtype;  -- курсорная переменная

BEGIN

. . .

END;

2.8.3. Открытие курсорной переменной

OPENимя_курсорной_переменнойFORинструкция_select;

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

·  Открытие курсорной переменной сильнотипизированного типа

DECLARE

TYPE sal_curtype IS REF CURSOR  RETURN sal%ROWTYPE;

cv_salsal_curtype;  -- курсорная переменная

BEGIN

OPEN  cv_sal  FOR  select  *  from  sal;

END;

·  Открытие курсорной переменной слаботипизированного типа

DECLARE

TYPE sal_curtype IS REF CURSOR;

cv_salsal_curtype;  -- курсорная переменная

BEGIN

OPEN  cv_sal  FOR  select  *  from  sal;

OPEN  cv_sal  FOR  select  sname, comm  from  sal;

OPEN  cv_sal  FOR  select  odate, amt  from  ord;

END;

2.8.4. Выборка данных из курсорной переменной

FETCHимя_курсорной_переменнойINTO имя_записи;

FETCHимя_курсорной_переменнойINTO имя_переменной, имя_переменной;

Если возвращаемые запросом данные не соответствуют структурам, указанным в предложении INTO, то генерируется исключение ROWTYPE_MISMATCH.

DECLARE

TYPE sal_curtype IS REF CURSOR  RETURN sal%ROWTYPE;

cv_salsal_curtype;  -- курсорная переменная

rec_sal  sal%ROWTYPE;

BEGIN

OPEN  cv_sal  FOR  select  *  from  sal;

FETCH  cv_sal  INTO rec_sal ;

CLOSE  cv_sal;

. . .

END;

Области видимости курсорной переменной и объекта курсора могут не совпадать.  Объект курсора остается доступным до тех пор, пока на него ссылается хоть одна активная переменная.

DECLARE

TYPE sal_curtype IS REF CURSOR  RETURN sal%ROWTYPE;

cv_sal1    sal_curtype;  -- курсорная переменная 1

rec_sal  sal%ROWTYPE;

BEGIN

DECLARE

cv_sal2    sal_curtype;  -- курсорная переменная 2

BEGIN

OPEN  cv_sal2  FOR  select  *  from  sal;

cv_sal1  :=  cv_sal2;