有没有办法选择引用游标的内容作为 SQL Select 语句的一部分?

Posted

技术标签:

【中文标题】有没有办法选择引用游标的内容作为 SQL Select 语句的一部分?【英文标题】:Is there a way of selecting the contents of a ref cursor as part of a SQL Select statement? 【发布时间】:2009-02-20 04:10:38 【问题描述】:

我希望能够获取一个引用光标并将其转换为另一个引用光标。例如,像这样:

begin
declare c_cur sys_refcursor;
        c_cur2 sys_refcursor;

open c_cur for 
  select 1 from dual;

open c_cur2 for
  select 1
    from c_cur
   where 1 = 2;

end;
/

Oracle 是否可以在 SELECT 语句中从引用游标的结果中进行选择?

【问题讨论】:

【参考方案1】:

您无法在此处完全按照您的意愿进行操作,但以下内容可能适合您的需求。基本上有两个游标 for 循环,其中一个从第一个游标中获取数据。

declare

cursor my_cur_1 is
select foo from bar;

cursor my_cur_2 (my_foo bar.foo%TYPE) is
select foo2 from bar2 where bar2.foo = my_foo;

begin

for t in my_cur_1 LOOP

  for s in my_cur_2(t.foo) LOOP
  -- do some stuff here with data from both.
  end loop;
end loop;

end;

【讨论】:

感谢您的回复,尼克!问题是我需要从我的例程中返回一个引用光标。我有一组返回相似结果的程序,并且想创建一个实用程序,如果适用,可以为每个结果添加一个额外的 WHERE 条件。【参考方案2】:

我不知道你为什么想要。我认为您正在寻找的是更多类似于bulk collect 的东西。这将允许您将结果提取到集合或表中,然后您可以从第二个查询中的结果中进行选择。更好的是,将其重构为一个更优雅的查询。

【讨论】:

【参考方案3】:

看起来你只是想动态构建一个 ref_cursor。

你可以这样做:

FUNCTION test_dyn_ref RETURN sys_refcursor IS
  l_cur2  sys_refcursor;
  l_query varchar2(4000);
begin
  l_query := 'select 1 from dual ';
  l_query := l_query||' where 1 = 2 ';
  --
  open l_cur2 for l_query;
  return l_cur2;
end;

【讨论】:

谢谢,埃德温!这看起来是一个不错的开始。但是,我想将类似的 WHERE 条件应用于一堆不同的查询。目前我将此条件附加到每个查询的末尾,但想封装它。理想情况下,该函数将接受一个引用光标并对其进行修改。 这种情况下,我不会将“基本”ref_cursor 作为参数传递,而是将 varchar2 变量与该 ref_cursor 的 SQL 一起传递。然后,您可以将不同的条件附加到该 sql 的末尾并返回一个 ref_cursor,就像我的示例中一样。

以上是关于有没有办法选择引用游标的内容作为 SQL Select 语句的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL 引用游标如何

Oracle PL SQL:比较两个存储过程返回的引用游标结果

有没有办法在不使用游标的情况下循环遍历 SQL 中的表变量?

PL/SQL 游标使用参数作为列名

PL/SQL-如何使用游标的所有列插入表

sql之cursor的简介与使用