Err*_*ion 2 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;
..........
Run Code Online (Sandbox Code Playgroud)
这不是正确的方法吗?
您似乎混淆了显式游标,例如:
declare
cursor cur is
select dummy from dual;
begin
for rec in cur
loop
dbms_output.put_line(rec.dummy);
end loop;
end;
/
Run Code Online (Sandbox Code Playgroud)
带有 ref 游标 - 这是一个指向打开的游标的指针。
您通常会使用 ref 游标在 db 中打开一个游标,并将其传递回调用应用程序以使其循环。
您将 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;
/
Run Code Online (Sandbox Code Playgroud)
但正如我所说,一般来说,您不会在数据库中循环遍历引用游标,而是在调用代码中这样做。
也许如果您根据您要满足的要求更新了您的问题,我们可以建议一种更好的方法。