如何从Oracle存储过程获取结果集?

时间:2015-06-09 19:11:56

标签: oracle stored-procedures resultset toad

这听起来像一个简单直接的问题,但我无法弄清楚。经过几个小时的网上搜索,我比起初更迷失。

我只是想编写一些代码来从我的程序中生成结果集。

这是程序的开始:

CREATE OR REPLACE PROCEDURE TEST_PROC
(
    Cursor       OUT     SYS_REFCURSOR,
    SDate        IN      DATE,
    EDate        IN      DATE,
    Department   IN      VARCHAR2,
    Users        IN      CLOB
)
IS
-- ... 

然后它继续从两个不同的表中选择字段,将它们连接在一起,应用一些过滤,就是这样。

如果要从表中返回结果集,可以编写如下内容:

SELECT * FROM TABLE;

我想做一些像这样简单易行的事情,但是从存储过程中获取数据。我知道当我调用该程序时,我必须提供参数。

我在TOAD中使用SQL。有人可以提供帮助吗?

2 个答案:

答案 0 :(得分:1)

示例程序

CREATE OR REPLACE PROCEDURE TEST_PROC (P1 OUT SYS_REFCURSOR)
AS
BEGIN
   OPEN P1 FOR SELECT * FROM user_tables;
END;

在Toad执行时告诉它在设置参数窗口中输出OUT参数的值,如屏幕截图所示。这是从Toad 12.7中获取的,所以你的对话框可能看起来不一样,但是这个选项已存在多年,你应该把它放在那里。

enter image description here

答案 1 :(得分:1)

CREATE OR REPLACE FUNCTION rs_func RETURN SYS_REFCURSOR IS
  l_result SYS_REFCURSOR;
BEGIN
  OPEN l_result FOR SELECT DUMMY FROM DUAL;
  RETURN l_result;
END;
/
SELECT rs_func FROM DUAL;

您还可以将参数应用于函数,并从任何表或连接的表组合中进行选择。使用上面的模板将执行查询作为函数的定义者。如果要将查询作为函数的调用者执行,则在函数规范中指定AUTHID CURRENT_USER。存储过程以类似的方式工作,但是根据您使用该过程的目标环境,存在一些使用复杂性。

您的问题请求能力     从表中选择* 但利用存储过程。您不能从仅SQL查询函数执行存储过程。有能力执行:     select * from table(stored_func(...)); 这利用了“Pipelined”函数,并且需要创建对象类型来定义函数的返回结构而不是结果集。