将RefCursor传递给函数时无效的光标

时间:2013-02-27 16:22:08

标签: oracle plsql

我正在尝试执行一个接收REFCURSOR的函数并执行一些数据操作。

为了测试我的功能,我有这个SQL / PLUS代码:

var some_cursor REFCURSOR;

exec :some_cursor := SCHEMA.test_getcursor;

print some_cursor;

variable res varchar2;

exec :res := SCHEMA.second_function(:some_cursor, 'Other_parameter');

print res;  

现在,第一个test_getcursor函数是一个简单的函数,它打开光标,执行选择查询并返回光标。它工作得很好,打印some_cursor就好了。

当我调用second_function并将refcursor传递给它时,问题就出现了。

函数具有以下代码:

type cursor_row
IS RECORD
(field_1 some_field1%type,
 field_2 some_field2%type,
 field_3 some_field3%type);

 new_row cursor_row;

BEGIN
LOOP
fetch PASSED_IN_REFCURSOR INTO new_row --this is where the function fails
...data manipulation...
EXIT WHEN PASSED_IN_REFCURSOR%NOTFOUND;
END LOOP;
CLOSE PASSED_IN_REFCURSOR;
END;

我得到的错误是Invalid Cursor

我确信我创建的类型与ref游标具有相同的行数和相同的数据类型。

在这种情况下我做错了什么?我正在使用Oracle 10g,PL / SQL 10.2

1 个答案:

答案 0 :(得分:3)

这是你的问题:

print some_cursor;

删除它。通过打印光标,您已获取所有记录并将其关闭。所以第二个功能不能再读它了。

例如

SQL> create procedure two(p_rc sys_refcursor)
  2  is
  3    v_col varchar2(1);
  4  begin
  5    loop
  6      fetch p_rc into v_col;
  7      exit when p_rc%notfound;
  8      dbms_output.put_line(v_col);
  9    end loop;
 10  end;
 11  /

Procedure created.

SQL> set serverout on
SQL> var rc refcursor;
SQL> exec :rc := one;

PL/SQL procedure successfully completed.

SQL> exec two(:rc);
X

PL/SQL procedure successfully completed.

VS

SQL> var rc refcursor;
SQL> exec :rc := one;

PL/SQL procedure successfully completed.

SQL> print rc

D
-
X

SQL> exec two(:rc);
BEGIN two(:rc); END;

*
ERROR at line 1:
ORA-01001: invalid cursor
ORA-06512: at "TEST.TWO", line 6
ORA-06512: at line 1

当光标未打开时,它会在fetch上弹出。如果您想提供更有用的错误,请先检查%isopen并提出已定义的错误。