2012-03-01 1 views
1

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

кодекса до сих пор:

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. Получение отсутствуют ошибки ключевых слов на столе (cast (курсор)) section
  2. Могу ли я получить доступ к курсору в коде как мне, или мне нужно его скопировать во внутреннюю переменную? Я попытался создать переменную типа sys_refcursor и «установить v_cursor: = o_results», но получил недостающую или недопустимую ошибку параметра.

ответ

0

Вы не можете использовать курсор 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; 

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

+0

спасибо. Увидев ожидаемый результат, я повторно проанализировал код. В то время как мои фактические курсоры намного сложнее выбирают, чем примеры, я понял, что могу просто сделать вложенный выбор в поле, которое мне нужно, из таблицы, о которой я беспокоюсь. – SpaceCowboy74

+0

О, что касается множества курсоров, это потому, что я не могу вернуть несколько строк для каждого элемента в первом курсоре. Это одно требование. Я мог бы, вероятно, сделать SQLFu и сделать список имен файлов выданным с запятой, но я решил, что конечный пользователь может просто использовать два набора данных в datatable в конечном счете. (есть несколько файлов на элемент) – SpaceCowboy74

 Смежные вопросы

  • Нет связанных вопросов^_^