显示oracle 10g存储过程的结果集

时间:2010-12-07 11:20:56

标签: oracle stored-procedures resultset plsqldeveloper

我正在使用PL / SQL Developer,我编写了一个程序来运行报告,我需要过程来输出结果集。

该过程接受输入参数,需要输出结果集。

我无法使用视图,因为该过程调用了几个接受我传入过程的参数的API。

我从很多搜索中了解到可以使用ref_cursor,但我无法工作。

该程序的简化版本是:

CREATE OR REPLACE PROCEDURE IFSINFO.SHORTAGE_SHEET (vSite     IN VARCHAR2,
                                                    vBuyer    IN VARCHAR2,
                                                    vSupplier IN VARCHAR2,
                                                    vCursor   OUT SYS_REFCURSOR)   
AS                                                    
BEGIN
    OPEN vCursor FOR                   
        SELECT blah blah blah blah blah blah;
END;

我尝试使用以下方法来演示过程并显示结果集:

BEGIN
    vsite       := 'S03';
    vbuyer      := 'AW';
    vsupplier   := '%';    
    vcursor     refcursor;

    IFSINFO.SHORTAGE_SHEET(vsite => :vsite,
                           vbuyer => :vbuyer,
                           vsupplier => :vsupplier,
                           vcursor => :vcursor);                           
    print vcursor;                           
END;

还有:

variable rc refcursor; 
exec IFSINFO.SHORTAGE_SHEET('S03','AW','TQ1',:rc2); 
print rc2

但是都不行。请有人建议我在我的智慧结束。

谢谢 罗布

4 个答案:

答案 0 :(得分:2)

执行此过程或在SQLPLUS中运行时是否出现错误? 你可以按原样发布你的sqlplus会话吗?

PRINT是一个特定于sqlplus的命令,不能在程序块中调用它。如果您需要在过程中打印refcursor的结果,那么您需要从中获取并以您需要的格式打印每条记录。

SQL> create or replace procedure test_REFCURSOR (
  2     i_number in number,
  3     o_cursor out sys_refcursor) 
  4  as
  5  begin
  6     open o_cursor for
  7        'select empno, ename from emp
  8             where rownum < ' || i_number ;
  9  end;
 10  /

Procedure created.

SQL> variable rc refcursor;
SQL> exec test_refcursor(5, :rc);

PL/SQL procedure successfully completed.

SQL> print rc;

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES

您还应该将过程调用(或)过程调用更改为具有不同的变量名.generallt,我将所有输入变量前缀为“i_”,所有输出变量前缀为“o_”。这样,你的程序声明就像......

CREATE OR REPLACE PROCEDURE IFSINFO.SHORTAGE_SHEET (i_Site     IN VARCHAR2,
                                                    i_Buyer    IN VARCHAR2,
                                                    i_Supplier IN VARCHAR2,
                                                    o_Cursor   OUT SYS_REFCURSOR) AS ....

并且程序调用将是..

IFSINFO.SHORTAGE_SHEET(    i_site     => vsite,
                           i_buyer    => vbuyer,
                           i_supplier => vsupplier,
                           o_cursor   => vcursor);

您不需要在这些变量的开头使用“:”,因为它们不是主机环境变量(这是使用SQLPLUS进行第二次执行的情况,在过程调用中使用sqlplus变量“rc”) / p>

答案 1 :(得分:1)

在pl / sql developer的底部,代码如下。

创建一个对象来存储结果集

CREATE OR REPLACE TYPE ABC.TEST_TYPE
AS OBJECT
( 
  "Site"                       VARCHAR2(25),
);

创建一个类型作为他上面的对象

的表
CREATE OR REPLACE TYPE ABC.TEST_COL 
    AS TABLE OF ABC.TEST_TYPE

创建一个包来执行SQL

CREATE OR REPLACE PACKAGE ABC.TEST_RPT AS
    FUNCTION get_report(vPart     VARCHAR2,
                        vBuyer    VARCHAR2,
                        vSupplier VARCHAR2) RETURN ABC.TEST_COL 
    PIPELINED;
END;

创建包体以执行SQL

CREATE OR REPLACE PACKAGE BODY ABC.TEST_RPT AS
  FUNCTION get_report(vPart     VARCHAR2,
                      vBuyer    VARCHAR2,
                      vSupplier VARCHAR2) RETURN ABC.TEST_COL 
    PIPELINED IS
    CURSOR cTest(vPart     VARCHAR2,
                 vBuyer    VARCHAR2,
                 vSupplier VARCHAR2) IS

          SELECT Site
            FROM table
           WHERE Part = vPart
             AND Buyer = vBuyer
             AND Supplier = vSupplier;



  BEGIN
    FOR part_rec IN cTest(vSite, vBuyer, vSupplier) LOOP
      PIPE ROW(ABC.TEST_TYPE(part_rec.Site));

    END LOOP;
    RETURN;
    CLOSE cTest;
  END;
END;

执行和输出结果集的代码

SELECT * FROM TABLE(ABC.TEST_RPT.get_report('','',''))

答案 2 :(得分:0)

我假设您正在使用Sql Plus来执行此操作。首先,定义一个Sql Plus refcursor。

variable vcursor refcursor

接下来,执行匿名pl / sql块。请注意declare关键字。


DECLARE
          vsite       := 'S03';
          vbuyer      := 'AW';
          vsupplier   := '%';
          -- do not declare this, use sql plus bind var     vcursor     refcursor;
BEGIN
IFSINFO.SHORTAGE_SHEET(vsite => vsite, -- no colon vbuyer => vbuyer, vsupplier => vsupplier, vcursor => :vcursor); END; /

然后运行这个sql plus命令。

print vcursor

打印不是pl / sql

答案 3 :(得分:0)

您的引用游标变量为rc。但是你使用rc2

rc2更改为rc,它应该可以正常工作