Oracle - 为显式游标打开sys_refcursor

时间:2014-01-23 17:33:37

标签: oracle plsql oracle11g cursor

我有一个返回sys_refcursor的函数,以便Java应用程序可以处理结果:

  function fn_stuff (in_array in t_id_array) return sys_refcursor is
    rc sys_refcursor;
  begin
    open rc for
        --query has been significantly shortened since most details are not 
        --relevant for this question.
        select * from some_table where id in table(in_array);
    return rc;
  end;

我也希望能够在PL / SQL中使用此功能。能够像这样引用此结果的行类型非常方便:

  procedure sp_f is
    rc sys_refcursor;
    arr t_id_array ;
    r c_stuff%rowtype;
  begin
    arr := t_id_array('11','22','33','44');

    rc := pkg_stuff.fn_stuff(arr);
    loop
     fetch rc into r
     exit when rc%notfound;
     dbms_output.put_line(r.col1||' '||r.col2);
   end loop;
  end;

为此,我需要将SELECT中的fn_stuff语句声明为正确的游标:

cursor c_stuff (in_array in t_id_array) is 
  select * from some_table where id in table(in_array);

然后我想更新函数以简单地引用我声明的新游标:

  function fn_stuff (in_array in t_id_array) return sys_refcursor is
    rc sys_refcursor;
  begin
    open rc for
        select * from c_stuff(in_array);
    return rc;
  end;

哪个收益率:

Error(52,37): PL/SQL: ORA-00904: : invalid identifier

我可以将SELECT语句保留在fn_stuff内,但它仍处于开发阶段,因此将查询放在一个位置会更容易。

有没有办法在声明的游标上打开并返回一个sys_refcursor?

我想另一种选择是我可以声明一个记录类型,其中包含查询选择的所有列,但由于查询仍在开发中,并且列中可能添加了从select中删除的记录类型必须保持同步。但由于sp_f程序只对一些可能不会改变的列感兴趣,我认为%rowtype会更好。

0 个答案:

没有答案