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

   FOR emp_rec IN c1 LOOP

      ...

 

      salary_total :=  salary_total + emp_rec.sal;

   END LOOP;

END;

 

Нужно использовать точечную запись, чтобы сослаться на индивидуальные поля в записи.

Рассмотрим блок PL/SQL ниже, который вычисляет, результаты эксперимента, затем сохраняет результаты в временной таблице. Индекс цикла  FOR c1rec  неявно объявлен как запись. Его поля хранят все значения столбца, выбранные из курсора c1.

 

DECLARE

   result temp.col1%TYPE;

   CURSOR c1 IS

      SELECT n1, n2, n3 FROM data_table WHERE exper_num = 1;

BEGIN

   FOR c1rec IN c1 LOOP

         /* calculate and store the results */

      result := c1rec.n2 / (c1rec.n1 + c1rec.n3);

      INSERT INTO temp VALUES (result, NULL, NULL);

   END LOOP;

   COMMIT;

END;

 

 При входе в курсорный цикл FOR, имя курсора не может принадлежать курсору, который был уже открыт оператором OPEN или вложенным курсорным циклом FOR. Перед каждой итерацией цикла FOR, PL/SQL выбирает в неявно объявленную запись, которая является эквивалентной записи, явно объявленной следующим образом:

 

c1rec c1%ROWTYPE;

 

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

 

FOR c1rec IN c1 LOOP

   ...

END LOOP;

result := c1rec.n2 + 3;  -- неправильно

 

Последовательность операторов внутри цикла выполняется один раз для каждой строки, которая удовлетворяет запрос, связанный с курсором. При выходе из цикла, курсор закрывается автоматически. Это истинно, даже если использовать оператор EXIT ИЛИ GOTO, чтобы оставить цикл преждевременно или если исключение вызвано внутри цикла.

Использование псевдонимов

Поля в неявно объявленной записи содержат значения столбца из наиболее недавно выбранной строкой. Поля имеют те же самые имена как соответствующие столбцы в списке выбора запроса. Но, что случается если единица выбора - выражение? Рассмотрите следующий пример: