从oracle过程获取返回

从oracle过程获取返回,oracle,stored-procedures,Oracle,Stored Procedures,您好,我已经创建了一个oracle过程,其中只包含带有选择项的联合。该过程是使用以下参数创建的: PROCEDURE mp_prov_preview(pDateFrom IN DATE, pDateTo IN DATE, preturn_cursor OUT spdutil.tref_cursor) IS v_cursor spdutil.tref_c

您好,我已经创建了一个oracle过程,其中只包含带有选择项的联合。该过程是使用以下参数创建的:

PROCEDURE mp_prov_preview(pDateFrom      IN DATE,
                            pDateTo        IN DATE,
                            preturn_cursor OUT spdutil.tref_cursor) IS

    v_cursor spdutil.tref_cursor;
我不明白的是如何从过程中获得返回结果集。我正在使用pl sql。我以这种方式尝试了,它执行了,但结果没有显示出来

begin
  -- Call the procedure
  mp_prov_preview('01-oct-2016',
                  '31-oct-2016',
                   :preturn_cursor);
end;

另外,我正在使用plsql

假设您有这样一个过程:

create or replace procedure cursorOut ( pIn  IN     number,
                                        pOut    OUT sys_refcursor
                                      ) is
begin
    open  pOut for select pIn       from dual union
                   select pIn * 100 from dual;
end;
在SQLPlus中,您可以通过以下方式调用它:

SQL> variable vCurs REFCURSOR
SQL> exec cursorOut ( 1, :vCurs);

PL/SQL procedure successfully completed.

SQL> print :vCurs

       :B1
----------
         1
       100
这将只打印查询结果;如果需要对查询返回的数据执行更多操作,可以使用PL/SQL块:

declare
    vCurs sys_refcursor;
    vVar  number;
begin
    cursorOut ( 1, vCurs);
    loop
        fetch vCurs
        into vVar;
        exit when vCurs%NOTFOUND;
        dbms_output.put_line(vVar);
    end loop;
end;
在这两种情况下,都可以使用
OUT
参数获得由过程生成的游标,然后使用该游标执行某些操作

第一种方法是特定于客户机的(我使用了SQLPlus),它为您提供了一个变量,您可以使用
print
命令(同样,在SQLPlus中)轻松打印该变量


在第二种方法中,您有一个PL/SQL变量,可用于构建循环并扫描每一行,以基于结果数据执行一些操作。这不依赖于客户端,因为客户端只使用PL/SQL。

这是因为您对结果不做任何操作。对于过程,“输出”结果定义为OUT参数,在您的例子中是
preturn\u cursor OUT spdutil.tref\u cursor
调用过程后,您必须使用此变量并在其上循环。因为这是一个查询的结果,只有联合。你可以添加一个关于OUT参数的解释,因为它似乎是他不理解的。