PL / SQL: наилучшая практика для извлечения 2 или более соединенных таблиц из курсора? - PullRequest
2 голосов
/ 26 февраля 2009

Я слышал, что хорошей практикой является определение ваших записей в PL / SQL с помощью атрибута% ROWTYPE. Это экономит набор текста и позволяет вашему пакету продолжать работу даже после добавления или удаления столбца. (Поправь меня, если я ошибаюсь!)

Однако, когда я выбираю из курсора, который включает в себя соединение, я обнаруживаю, что мне нужно извлечь в определенную программистом запись, которая включает (возможно, очень длинный) рукописный список каждого столбца, возвращаемого объединением .

Итак, мой вопрос: Можно ли извлечь из вложенных записей или из списка записей, или сделать что-то , чтобы избежать такого уродливого клуджа? Все, что я пробовал, приводит к ошибке о том, что запись не соответствует тому, что возвращается курсором.

Возвращение результата объединения с использованием курсора мне кажется настолько распространенным вариантом использования, что странно, что ничего не связанного с этим не появляется при поиске.

Спасибо.

Ответы [ 2 ]

8 голосов
/ 26 февраля 2009

Вы можете использовать пользовательский курсор% rowtype.

Пример:

declare
cursor c_c is
select emp.*, dept.* -- use aliasses if columns have same name
from emp
,    dept; -- for sample no join condition

r_c c_c%rowtype; 

begin
  for r_c in c_c loop -- with for loop even the definition of r_c is not needed.
  ...
  end loop;
end;
/
5 голосов
/ 26 февраля 2009

Зачем вообще беспокоиться об объявлении курсора?

Это эквивалентно.

begin
  for r_c in (select emp.*, dept.* from emp, dept) loop
  ...
  end loop;
end;

Я вижу, в вашем комментарии вы упомянули это. Но я вижу, что явный синтаксис курсора используется так много, что я думаю, что это важно показать.

...