PLS-00221:' C1'(游标)不是程序或未定义

时间:2015-07-08 12:18:27

标签: oracle stored-procedures cursors

我正在创建一个与Jasper报告一起使用的包,我知道我需要SYS_REFCURSOR,但我似乎无法循环我的游标:例如

create or replace PACKAGE BODY                                                                                                                                                                                                      fin_statement_spool
AS
   PROCEDURE fin_main_spool(vacid in VARCHAR2, vfromdate in date, vtodate in date,c1 out  SYS_REFCURSOR,c2 out  SYS_REFCURSOR)
   AS
      cramount            NUMBER;
      dramount            NUMBER;
      countcr             NUMBER;
      countdr             NUMBER;
BEGIN
    OPEN c1 FOR
        SELECT
            .......;
 OPEN c2  FOR
        SELECT ........;
 BEGIN
      FOR i IN c1--Error is here
      LOOP
        rnum        := 0;
        cramount    := 0;
        dramount    := 0;
        countdr     := 0;
        countcr     := 0;
       ..........

这不是正确的方法吗?

1 个答案:

答案 0 :(得分:3)

您似乎混淆了明确的游标,例如:

declare
  cursor cur is
  select dummy from dual;
begin
  for rec in cur
  loop
    dbms_output.put_line(rec.dummy);
  end loop;
end;
/

带有引用游标 - 这是指向打开游标的指针。

您通常会使用引用游标在数据库中打开游标并将其传递回调用应用程序以使其循环。

您将ref游标声明为out参数然后尝试在同一过程中循环它们的方式没有意义 - 一旦从游标中获取了一条记录,就无法重新获取它。

如果你绝对必须循环参考游标,你可以使用这种语法:

declare
  cur sys_refcursor;
  rec dual%rowtype;
begin
  open cur for select dummy from dual;
  loop
    fetch cur into rec;
    exit when cur%notfound;
    dbms_output.put_line(rec.dummy);
  end loop;
end;
/

但正如我所说的那样,一般情况下,你不会在数据库中循环参考游标,你可以在调用代码中这样做。

也许如果您使用您尝试实现的要求更新了问题,我们可以建议更好的方法。