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;
/
但正如我所说,一般来说,您不会在数据库中循环引用游标,而是在调用代码中这样做。
也许如果您用您试图满足的要求更新了您的问题,我们可以建议更好的方法。
我正在创建一个与 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;
/
但正如我所说,一般来说,您不会在数据库中循环引用游标,而是在调用代码中这样做。
也许如果您用您试图满足的要求更新了您的问题,我们可以建议更好的方法。