PLS-00221:“C1”(光标)不是过程或未定义(PLS-00221: 'C1'

2019-10-23 16:48发布

我创建一个包,我才知道我需要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;
       ..........

这不是正确的方式?

Answer 1:

你似乎有混淆明确指针,例如:

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

用引用游标 - 这是一个指向一个打开的游标。

您通常会使用一个参考光标,打开一个数据库中的光标,并通过它传递回调用应用程序它循环。

声明该引用游标作为输出参数,然后一路走过他们试图循环在同一程序中没有任何意义 - 一旦你已经从一个游标的记录,则无法重新取回它。

如果你绝对必须通过裁判游标循环,你会使用这种语法:

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

但正如我所说,在一般情况下,您将无法通过引用游标在db循环,你会做,在调用代码。

或许,如果你与你想满足要求更新您的问题,我们可以提出这样做​​的更好的方法。



文章来源: PLS-00221: 'C1'(cursor) is not a procedure or is undefined