有没有办法选择引用游标的内容作为 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:比较两个存储过程返回的引用游标结果