在 Proc 中使用 Oracle 游标并返回它?

Posted

技术标签:

【中文标题】在 Proc 中使用 Oracle 游标并返回它?【英文标题】:Use Oracle Cursor in Proc and Return it? 【发布时间】:2012-03-01 20:31:02 【问题描述】:

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

到目前为止的代码:

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;

我遇到问题的领域:

    在 table(cast(cursor)) 部分出现缺少关键字的错误 我可以照原样访问代码中的光标还是需要将其复制到内部变量中?我尝试创建一个 sys_refcursor 类型的变量和一个“set v_cursor := o_results”,但得到一个缺失或无效选项错误。

【问题讨论】:

【参考方案1】:

您不能使用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;

但是,如果您的过程所做的只是打开一个游标,那么创建一个视图而不是创建一个过程然后查询该视图而不是调用该过程会更常见。

【讨论】:

谢谢。在等待结果的同时,我重新分析了代码。虽然我的实际游标选择比示例复杂得多,但我意识到我可以从我关心的表中对我需要的字段进行嵌套选择。 哦,关于多个游标,那是因为我不能为第一个游标中的每个项目返回多行。这是一对一的要求。我可能会做一些 SQLfu 并让 file_name 列表以逗号分隔,但我认为最终用户从长远来看只能使用两个数据表数据集。 (每个项目有多个文件)

以上是关于在 Proc 中使用 Oracle 游标并返回它?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle存储过程游标for循环怎么写

调用返回游标的 oracle 函数

Oracle 11g:在过程中使用游标

如何从存储过程中获取嵌套游标 - Java & Oracle

如何使用Oracle的游标?

Oracle函数:如何将表名作为参数传递,并使用游标结果作为表名?