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

 

CURSOR c1 IS

   SELECT empno, sal+NVL(comm,0), job FROM ...

 

В таких случаях, нужно включить псевдоним для единицы выбора. В следующем примере, заработная плата - псевдоним для единицы выбора sal+NVL(comm,0):

 

CURSOR c1 IS

   SELECT empno, sal+NVL(comm,0) wages, job FROM ...

 

Чтобы ссылаться на соответствующее поле,  используется псевдоним вместо имени столбца, следующим образом:

 

IF emp_rec.wages < 1000 THEN ...

Передача параметров

Можно передавать параметры для курсора, используемого в курсорном цикле FOR. В следующем примере, передается номер отдела. Затем,  вычисляется общая заработная плата, оплаченная служащим в том отделе. Также, определяется, сколько служащих имеют жалованье выше чем $ 2000 и сколько имеют комиссии большими чем их жалованье.

 

-- доступный интерактивно в файле EXAMP8

DECLARE

   CURSOR emp_cursor(dnum NUMBER) IS

      SELECT sal, comm FROM emp WHERE deptno = dnum;

   total_wages NUMBER(11,2) := 0;

   high_paid   NUMBER(4) := 0;

   higher_comm NUMBER(4) := 0;

BEGIN

   /* Число итераций будет равняться числу строк *

    * возвращенных emp_cursor. */

   FOR emp_record IN emp_cursor(20) LOOP

      emp_record.comm := NVL(emp_record.comm, 0);

      total_wages := total_wages + emp_record.sal +

         emp_record.comm;

      IF emp_record.sal > 2000.00 THEN

         high_paid := high_paid + 1;

      END IF;

      IF emp_record.comm > emp_record.sal THEN

         higher_comm := higher_comm + 1;

      END IF;

   END LOOP;

   INSERT INTO temp VALUES (high_paid, higher_comm,

      'Total Wages: ' || TO_CHAR(total_wages));

   COMMIT;

END;

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

Подобно курсору, курсорная переменная указывает на текущую строку активного множества многострочного запроса. Но, в отличие от курсора, курсорная переменная может быть открыта для любого запроса совместимого по типам. Она не привязана к определённому запросу. Курсорные переменные являются настоящими переменными PL/SQL, которым можно присваивать новые значения и которые можно передавать подпрограммам, хранимым в базе данных Oracle. Это дает большую  гибкость и удобный способ централизовать поиск данных.