您好,欢迎访问一九零五行业门户网

【ORACLE】用FUNCTION动态获得结果集

主要说明returnpipelined,经验者请绕道。最近我得到了一个需求:要求为method传入string,内容如用户id0,用户id1,用户id2...,然后根据这些id返回一个结果集作
正好oracle方面博客还没有这方面内容,趁此机会便写一小段。
既然我们要返回一个结果集,那便是要得到一个table of xxx类型,xxx可以是varchar2或者integer或者某个表的%rowtype,但我的情况稍微复杂一点,我要自己创建一个object type。
于是我们要写的function的return类型是这样创建的:
create or replace type typ_user_record as object (user_id char(40),user_num varchar2(200),create_date date);create or replace type typ_user_tbl as table of typ_user_record;
下面是function的创建:
create or replace function regroup_user_by_useridstr(useridstr in varchar2) return typ_user_tbl pipelined is--参数声明开始 type user_cursor is ref cursor; user_info_list user_cursor;--用来获得检索结果的cursortype user_row is record(user_id char(40),user_num varchar2(200),create_date date); user_info user_row;--用于提取cursor中的记录的recorduser_row4result typ_user_record; --我们要返回的数据集的数据行对象 querystrvarchar2(2000); --拼接后的select语句--参数声明结束begin --此处根据传入的id进行了各种判断拼接select语句 并给querystr赋值 open user_info_list for querystr; --打开cursor --循环从cursor获得结果 并将结果变成typ_user_record对象 再将对象放到pipe里 loopfetch user_info_list into user_info;exit when user_info_list%notfound;user_row4result := typ_user_record(user_info.user_id,user_info.user_num,user_info.create_date);pipe row(user_row4result); end loop; close user_info_list; return;end;
既然return type是table类型的,调用时便可以使用table()函数进行查询。
select * from table(regroup_user_by_useridstr)另外,本人目前工程中使用的持久化框架是mybatis,此语句运行无误。
参数虽然可以直接传入select * from xx in ()进行查询,但也可能需要进行截取变成collecion,下面附上该功能的function:
create or replace type tbl_varchar2 as table of varchar2(400);create or replace function str2tbl( param_str in varchar2 ) return tbl_varchar2 astmp_record long default param_str || ',';row_indexnumber;tmp_tbl tbl_varchar2 := tbl_varchar2(); beginlooprow_index := instr( tmp_record, ',' );exit when (nvl(row_index,0) = 0);tmp_tbl.extend;tmp_tbl( tmp_tbl.count ) := ltrim(rtrim(substr(tmp_record,1,row_index-1)));tmp_record := substr( tmp_record, row_index+1 );end loop;return tmp_tbl; end;
本文出自 “it's swfupload!!” 博客,,请务必保留此出处
其它类似信息

推荐信息