在Proc中使用Oracle Cursor并返回它?

时间:2012-03-01 20:31:02

标签: plsql packages oracle9i sys-refcursor

我正在开发一个将返回两个游标的包。一个光标是带有数字主键的项目列表。另一个光标是与项目相关联的文件列表

到目前为止

代码:

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. 上获得缺少的关键字错误
  3. 我可以像我一样访问代码中的光标,还是需要将其复制到内部变量?我试图创建一个sys_refcursor类型的变量和一个“set v_cursor:= o_results”,但是错误或无效的选项错误。

1 个答案:

答案 0 :(得分: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;

但是,如果所有过程都在打开游标,那么创建视图而不是创建过程然后查询视图而不是调用过程会更常见。