我正在创建一个与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;
..........
这不是正确的方法吗?
答案 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;
/
但正如我所说的那样,一般情况下,你不会在数据库中循环参考游标,你可以在调用代码中这样做。
也许如果您使用您尝试实现的要求更新了问题,我们可以建议更好的方法。