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

TYPE  t_t_var  IS  TABLE  OF  varchar2(20)

      INDEX BY binary_integer;

tName     t_t_var;

tCity         t_t_var;

BEGIN

SELECT  sname, city  BULK COLLECT  INTO   tName, tCity

     FROM sal  WHERE  comm < 0.2;

-- работасколлекциями

END;

DECLARE

CURSOR c_sal(p_Comm number)  IS

SELECT  *  FROM sal  WHERE  comm > p_Comm;

TYPE  t_t_sal  IS  TABLE  OF  c_sal %ROWTYPE

      INDEX BY binary_integer;

tSal          t_t_sal;

BEGIN

OPEN  c_sal( 0.1);

FETCH  c_sal   BULK COLLECT  INTO   tSal   LIMIT 5;

-- работас коллекцией

END;

·  Ключевыеслова BULK COLLECT можноиспользоватьтольковпредложениях SELECT INTO,  FETCH INTO  и  RETURNING INTO

·  Начиная с Oracle9iBULKCOLLECT можно применять в динамическом SQL

·  Коллекции строк можно применять в BULKCOLLECT только начиная с Oracle9iRelease2

·  Коллекции заполняются начиная с индекса 1, и далее элементы добавляются последовательно (без пропусков), заменяя уже имеющиеся

·  SELECTBULKCOLLECT нельзя использовать в операторе FORALL

FORALL idx  IN  tName.first .. tName.last

UPDATE  sal  SET  comm = comm + 0.05  WHERE  sname = tName(idx)

    RETURNING  comm  BULK COLLECT  INTO   tComm;

RETURNING в операторе FORALL заполняет коллекцию tComm последовательно для всех операторов UPDATERETURNING в операторе FOR заполняет коллекцию заново для каждого UPDATE, затирая уже имеющиеся элементы коллекции.


2.7. SELECT c предложением FOR UPDATE

Инструкция SELECTc предложением FORUPDATE заблокирует набор выбранных строк еще до того, как вы приступите к их изменению. Никто не сможет изменить эти строки, пока вы не выполните COMMIT или ROLLBACK.

CURSOR c_sal(p_Comm number)  IS

SELECT  *  FROM sal  WHERE  comm.> p_Comm

FOR  UPDATE;

CURSOR c_sal(p_Comm number)  IS

SELECT  s.sname, o.odate, o.amt 

FROM sal  s, ord o

WHERE  s.snum=o.snum  AND  s.comm> p_Comm

FOR  UPDATE  OF   o.amt;

После выполнения оператора COMMIT или ROLLBACK текущая позиция в открытом курсоре будет утеряна. Последующее выполнение оператора FETCH вызовет исключительную ситуацию.

В инструкциях  UPDATE  и  DELETE  можно использовать специальное предложение  WHERECURRENTOF  для обработки последней выбранной из курсора строки.

… WHERE  CURRENT  OF  имя_курсора


2.8. Курсорные переменные

Курсорная переменная – это переменная, содержащая ссылку на курсор. Курсорные переменные предоставляют механизм передачи результатов запроса между разными программами PL/SQL.

Все возможности статических курсоров и методы работы с ними применимы при использовании курсорных переменных. Используются операторы OPEN, FETCH и CLOSE. Доступны стандартные атрибуты курсоров – %ISOPEN, %FOUND, %NOTFOUND и %ROWCOUNT.