Теория для лабораторной работы №5 - "PL/SQL – курсоры и хранимые процедуры", страница 13

 

DELETE FROM emp WHERE ...

IF SQL%ROWCOUNT > 10 THEN  -- было удалено более десяти строк

   ...

END IF;

 

Если утверждение SELECT INTO возвращает больше чем одну строку, PL/SQL вызывает предопределенное исключение TOO_MANY_ROWS, и % ROWCOUNT производит 1,а не фактическое число строк, которые удовлетворяют запрос.

Создание пакетного курсора

Пакетный курсор подобен процедуре в том, что описание курсора и типа возвращаемого атрибута располагается в области спецификации пакета. Затем определяется "тело" курсора в области спецификации тела пакета:

 

CREATE OR REPLACE PACKAGE ORDER_TOTAL

AS

cursor c_line_item return line_item.merch_gross%TYPE;

      ...

end order_total;

 

CREATE OR REPLACE PACKAGE BODY ORDER_TOTAL

AS         

      CURSOR c_line_item RETURN line_item.merch_gross%TYPE

               SELECT merch_gross

               FROM line_item

                WHERE order_num = g_order_num;

      ...

END orde_total;

 

Пример.

Следующий курсор извлекает из таблицы emp информацию о 5 самых высокооплачиваемых служащих и заносит ее в предварительно созданную таблицу tmp.

 

 DECLARE                         

   CURSOR c1 IS                  

     SELECT ename, sal FROM emp  

     ORDER BY sal DESC;          

   name       emp.ename%TYPE;

   salary     emp.sal%TYPE;          

 BEGIN                                           

   OPEN c1;

   FOR i IN 1..5 LOOP                            

     FETCH c1 INTO name, salary;                

     EXIT WHEN c1%NOTFOUND;                     

     INSERT INTO tmp VALUES(name, salary);      

     COMMIT;                                    

   END LOOP;