【问题标题】:Using output from Procedure in another Procedure in Oracle SQL在 Oracle SQL 的另一个过程中使用过程的输出
【发布时间】:2014-09-03 16:16:36
【问题描述】:

我的程序如下所示:

    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 传递给另一个过程并选择它(可能是个坏主意)?或者临时表在这里有帮助吗?

我知道我可以将其合并为一个程序,但我需要分别来自这两个程序的数据,因为它们都与我正在做的事情相关。

【问题讨论】:

  • 你的意思是喜欢在 SELECT 中使用 SELECT 吗?
  • 不,本质上我想做的是制作一个可以SELECT * FROM proc1(variables)的程序。我希望将一个过程的输出传递给另一个单独的过程。
  • 您可以创建两个单独的过程,并在发生正确验证时调用另一个过程中的一个过程
  • 从另一个过程中调用一个过程是我想要做的,但是我能否进一步操作从另一个过程中调用的过程输出的数据?

标签: sql oracle stored-procedures


【解决方案1】:

一旦将结果集包装在游标中,您的 sql 选项就会受到限制。您当然可以将光标传递给另一个函数并从那里 fetch。但是您必须自己完成所有肮脏的过滤工作。

仍然传递游标有时是一种有效的设计模式。通常,您将从游标中获取并从中生成其他选择。但是,在您的情况下,您希望进一步过滤您的数据,在这种情况下,游标通常不是一个好的选择,因为您失去了 SQL 的力量。

如果你真的想做这样的事情,你可以使用流水线函数。与游标相比,这些允许您创建一个(虚拟)表,您可以在其中再次使用普通的旧选择。当然,当给定游标时,您可以通过从游标中获取并重复调用 管道行 来创建这样的流水线函数。

但所有这些都很乏味,并且需要相当多的样板代码。

一般来说,只用不同的 where 子句编写多个选择并没有太多的惩罚。如果您想明确编码这些选择越来越限制结果集,请使用 select from select,也许将内部选择放入视图中,从而创建视图层次结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多