从Oracle函数返回ref游标

从Oracle函数返回ref游标,oracle,plsql,ref-cursor,Oracle,Plsql,Ref Cursor,我收到错误-PLS-00382表达式的类型错误。 我想把ref游标作为输出。请让我知道我该怎么做 create or replace function test_cur return sys_refcursor as var_ref sys_refcursor; begin open var_ref for select item,status from item_master where rownum <10; return var_ref; end;

我收到错误-PLS-00382表达式的类型错误。
我想把ref游标作为输出。请让我知道我该怎么做

create or replace function  test_cur
return sys_refcursor
as
  var_ref sys_refcursor;
begin
  open var_ref for
  select item,status
    from item_master  
   where rownum <10;
  return var_ref;
end;


declare
  l_var sys_refcursor;
  l_item varchar2(100);
  l_status varchar2(10);
begin
  l_var:=test_cur;
  open l_var;
  loop
    fetch l_var into  l_item,l_status;
    exit when l_var%notfound;
    dbms_output.put_line(l_item||','||l_status);
  end loop;
end;
创建或替换功能测试\u cur
返回系统参考光标
作为
变量参考系统参考光标;
开始
打开var_ref以获取
选择项目、状态
从项目_主文件

其中rownum有几个错误,看看我的工作示例,只是更改了源表:

CREATE OR REPLACE FUNCTION  TEST_CUR RETURN SYS_REFCURSOR
AS
   VAR_REF SYS_REFCURSOR;
BEGIN
    OPEN VAR_REF FOR
        SELECT *
        FROM DUAL;

    RETURN VAR_REF;
END;
这里不需要打开光标,它已经打开了

DECLARE
    L_VAR SYS_REFCURSOR;
    L_STATUS VARCHAR2(10);
BEGIN
    L_VAR:=TEST_CUR;
    LOOP
        FETCH L_VAR INTO L_STATUS;
        EXIT WHEN L_VAR%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE( L_STATUS );
    END LOOP;
    CLOSE L_VAR;
END;
一篇非常有趣的文章展示了如何测试oracle游标:


这个l\u变量不应该=测试值吗;be l_var:=test_cur();确保生产代码中没有
DBMS\u输出
。希望
DBMS\u输出
语句不会移动到生产中。我们应该在哪里关闭光标?在这种情况下,Oracle将在光标超出范围后立即关闭光标。然而,我必须说,明确地关闭它应该是一个好习惯。让我更新答案。欢迎来到堆栈溢出。对于堆栈溢出,不鼓励使用仅代码的答案,因为它们没有解释堆栈溢出是如何解决问题的。请编辑您的答案,解释代码的作用以及它如何解决问题中的问题,以便对其他有类似问题的用户也有用。
declare
  l_var sys_refcursor;
  l_item varchar2(100);
  l_status varchar2(10);
begin
  l_var:=test_cur;
  --open l_var; this is already opened in the fuction.
  loop`enter code here`
    fetch l_var into  l_item,l_status;
    exit when l_var%notfound;
    dbms_output.put_line(l_item||','||l_status);
  end loop;
end;