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

PLS-00221: 'C1'(cursor) is not a procedure or is undefined

我正在创建一个与 Jasper 报告一起使用的包,我了解到我需要 SYS_REFCURSOR 但我似乎无法循环我的 cursors:eg

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;
       ..........

这样不对吗?

您似乎混淆了显式游标,例如:

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;
/

但正如我所说,一般来说,您不会在数据库中循环引用游标,而是在调用代码中这样做。

也许如果您用您试图满足的要求更新了您的问题,我们可以建议更好的方法。