从oracle SP获取结果[光标]

从oracle SP获取结果[光标],oracle,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,:cs

我正在尝试从返回游标的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;
我环顾四周,寻找这类问题,我是否得到了上面的代码

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

rej_rec Reasons_for_Rejection%ROWTYPE;
拒绝的原因\u
应该是表名…但是在我的SP中,他们使用一些内部表,因为查询如下:

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

你应该说一些比“似乎不起作用”更具体的话。但是我发现您的示例的第一个错误是您混淆了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声明并不意味着必须直接从给定的表填充记录,只意味着记录的字段及其类型与表中某一行的字段及其类型相匹配。这些字段可以像任何其他变量一样被引用和分配。

如果您使用的是SQL*Plus,则不需要声明

因为你没有给我们任何细节,所以很难知道你的代码为什么不工作。但这是你应该做的事情:

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>