我有一个看起来像这样的程序:
create or replace procedure proc1 (prc out sys_refcursor, <filter variables>)
as
begin
open prc for (select * from blah blah blah.. <logic using filter variables,
calculations,etc>
end proc1
我想知道是否可以在另一个过程中使用此过程的输出来进一步过滤我正在查看的数据并进行更多计算。有没有办法将sys_refcursor传递给另一个程序并选择进入(可能是一个坏主意)?或者临时表会帮到这里吗?
我知道我可以把它变成一个程序,但我需要分别来自两个数据,因为它们都与我正在做的事情相关。
答案 0 :(得分:1)
将结果集包装到游标中后,sql选项会受到限制。您当然可以将光标传递给另一个函数,然后从那里获取。但是你必须自己做所有脏过滤工作。
仍然传递游标有时是一种有效的设计模式。您将从光标中获取并从中生成其他选择。但是,在您的情况下,您希望进一步过滤数据,在这种情况下,光标通常不是一个好的选择,因为您失去了SQL的强大功能。
如果您真的想做这样的事情,可以使用流水线功能。与游标相比,这些允许您创建一个(虚拟)表,您可以在其中再次使用普通旧选择。当然,你可以通过从中获取游标并重复调用 pipe row 来创建这样的流水线函数。
但所有这些都很乏味,需要一些样板代码。
一般来说,只用不同的where子句编写多个选项并没有太多的惩罚。如果要显式编码这些选择越来越多地限制结果集,请使用select from select,也可以将内部选择放入视图中,从而创建视图层次结构。