Использовать Oracle Cursor в Proc и вернуть его? - PullRequest
1 голос
/ 02 марта 2012

Я работаю над пакетом, который вернет два курсора.Один курсор представляет собой список элементов с числовым первичным ключом.Другой курсор - это список файлов, связанных с элементами

Код на данный момент:

procedure get_items_with_files(
           o_results out sys_refcursor,
           o_files out sys_refcursor
) is 
begin

   begin
      open o_results for
          select item_id,
                 item_name
          from items;
   end;

   begin
      open o_files for
           select item_id
                  item_file_name
           from item_files if
           where if.item_id in (select item_id from TABLE(CAST(o_results)));
   end;
end get_items_with_files;

Области, с которыми я сталкиваюсь:

  1. Получениеошибка отсутствующего ключевого слова в секции таблицы (приведение (курсор))
  2. Могу ли я получить доступ к курсору в коде как есть, или мне нужно скопировать его во внутреннюю переменную?Я пытался создать переменную типа sys_refcursor и "set v_cursor: = o_results", но получил ошибку отсутствующей или недопустимой опции.

1 Ответ

0 голосов
/ 02 марта 2012

Вы не можете использовать курсор O_RESULTS, чтобы открыть курсор O_FILES.

Вы можете запросить таблицу ITEMS, чтобы открыть оба курсора, но это создает вероятность изменения некоторых данных.между открытием курсора O_RESULTS и временем открытия курсора O_FILES и тем, что два набора результатов не синхронизированы.

procedure get_items_with_files(
           o_results out sys_refcursor,
           o_files out sys_refcursor
) is 
begin

   begin
      open o_results for
          select item_id,
                 item_name
          from items;
   end;

   begin
      open o_files for
           select item_id
                  item_file_name
           from item_files if
           where if.item_id in (select item_id from items);
   end;
end get_items_with_files;

Было бы гораздо более распространенным возвратить один курсоркоторый представляет собой результат объединения двух таблиц

procedure get_items_with_files(
           o_results out sys_refcursor
) is 
begin
  open o_results for
      select item_id,
             item_name,
             item_file_name
        from items
             join item_files using (item_id);
end get_items_with_files;

Если все, что делает ваша процедура - это открытие курсора, однако, было бы более распространенным создать представление, а не создать процедуру, а затем запросить представлениевместо вызова процедуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...