从oracle SP [cursor]获取结果

时间:2009-08-27 17:41:43

标签: oracle

我正在尝试从正在返回游标的oracle SP获取结果。 我有以下代码似乎不起作用......

declare VARIABLE csr1 REFCURSOR;
declare VARIABLE csr2 REFCURSOR;
declare VARIABLE csr3 REFCURSOR;
declare VARIABLE csr4 REFCURSOR;
declare VARIABLE csr5 REFCURSOR;
EXEC getReportData('PUB',:csr1,:csr2,:csr3,:csr4,:csr5); 
PRINT csr1;

我环顾四周寻找这类问题,that在那里我得到了上面的代码。

在同一个答案中,还有第二个循环选项。但这对我不起作用,因为该代码中的一行代表说:

rej_rec Reasons_for_Rejection%ROWTYPE;

Reasons_for_Rejection应该是表名...但是在我的SP中他们使用的是一些内部表,因为查询是这样的:

select c.blah from (select blah1 from blah) c

2 个答案:

答案 0 :(得分:2)

你应该说一些比“似乎不起作用”更具体的东西。但是我对你的样本看到的第一件事就是你混淆了SQLPlus和PL / SQL。

我假设您在SQLPlus中键入命令或将其作为脚本运行。

“DECLARE”开始一个PL / SQL块,直到在新行上输入正斜杠才会执行。因此,如果您以交互方式键入这些命令,则可能只是提示您输入更多内容:

SQL> declare VARIABLE csr1 REFCURSOR;
  2  declare VARIABLE csr2 REFCURSOR;
  3  declare VARIABLE csr3 REFCURSOR;
  4  declare VARIABLE csr4 REFCURSOR;
  5  declare VARIABLE csr5 REFCURSOR;
  6  EXEC getReportData('PUB',:csr1,:csr2,:csr3,:csr4,:csr5); 
  7  PRINT csr1;
  8  /
SP2-0552: Bind variable "CSR5" not declared.
SQL> 

您尝试使用的其他命令是SQLPlus命令。 VARIABLE命令在SQLPlus中声明一个绑定变量 - 它根本不涉及DECLARE关键字。所以你应该试试这个:

VARIABLE csr1 REFCURSOR;
VARIABLE csr2 REFCURSOR;
VARIABLE csr3 REFCURSOR;
VARIABLE csr4 REFCURSOR;
VARIABLE csr5 REFCURSOR;
EXEC getReportData('PUB',:csr1,:csr2,:csr3,:csr4,:csr5); 
PRINT csr1;

我真的不明白你问题的其余部分。 %ROWTYPE声明并不意味着必须直接从给定表填充记录,只是其字段及其类型与表中的行匹配。这些字段可以像任何其他变量一样被引用和分配。

答案 1 :(得分:0)

如果您使用的是SQL * Plus,则不需要DECLARE。

由于您未向我们提供任何详细信息,因此很难知道您的代码无效的原因。但这是你应该做的事情:

SQL> create or replace procedure getReportData
  2      (dno in dept.deptno%type
  3       , d_recs out sys_refcursor
  4       , e_recs out sys_refcursor)
  5  is
  6  begin
  7      open d_recs for
  8          select * from dept where deptno = dno;
  9      open e_recs for
 10          select * from emp where deptno = dno;
 11  end;
 12  /

Procedure created.

SQL> var rc1 refcursor
SQL> var rc2 refcursor
SQL>
SQL> exec getReportData (30, :rc1, :rc2)

PL/SQL procedure successfully completed.

SQL>
SQL> print rc1

    DEPTNO DNAME          LOC
---------- -------------- -------------
        30 SALES          CHICAGO

SQL> print rc2

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM
---------- ---------- --------- ---------- --------- ---------- ----------
    DEPTNO
----------
      7499 VAN WIJK   SALESMAN        7698 20-FEB-81       1600        300
        30

      7521 PADFIELD   SALESMAN        7698 22-FEB-81       1250        500
        30

      7654 BILLINGTON SALESMAN        7698 28-SEP-81       1250       1400
        30


      7698 SPENCER    MANAGER         7839 01-MAY-81       2850
        30

      7900 HALL       CLERK           7698 03-DEC-81        950
        30

SQL>