我有一个返回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
会更好。