在oracle中手动创建split函数

来源:互联网 发布:网络直复营销 编辑:程序博客网 时间:2024/05/22 07:08

      PL/SQL 函数返回数据的多个行,可以通返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 这种情况局限于可以从查询选择的数据,而整个集合在可以返回前,必须进行具体化。ORACLE 9i 引入的管道化表函数正了后一情况。表函数是返回整个行的集(通常作一个集合)的函数,可以直接从 SQL 句中查询,就好像它是一个真正的数据表一。管道化表函数与之相似,但是它像在构建返回数据,而不是一次全部返回。管道化表函数更加有效,因数据可以尽可能快地返回。

管道化表函数必返回一个集合。在函数中,PIPE ROW 句被用来返回集合的个元素,函数必以一个空的 RETURN 束,以表明它已完成。一旦我们创建了上述函数,我就可以使用 TABLE 操作符从 SQL 查询用它。

管道化表函数常被用来把数据从一种类化成另一种类型。  

create or replace package pk_Base is
type t_split_tbl is table of varchar2(32767);
function split(p_list varchar2,p_del varchar2 := ',')
        return t_split_tbl pipelined;
end pk_Base;
/
create or replace package body pk_Base is
function split(p_list varchar2,p_del varchar2 := ',')
         return t_split_tbl pipelined
is
     l_idx pls_integer;
     l_list varchar2(32767) := p_list;
     l_value varchar2(32767);
begin
   loop
      l_idx := instr(l_list,p_del);
      if l_idx > 0 then
         pipe row(substr(l_list,1,l_idx-1));
         l_list := substr(l_list,l_idx+length(p_del));
      else
          pipe row(l_list);
          exit;
       end if;
   end loop;
   return;
end;
end pk_Base;
/
 
测试select * from table (pk_Base.split('1,12,123,1234,12345'));
果:
1
12
123
1234
12345
注意:以上函数限于oracle9i及其以上版本!
 
 
 
原创粉丝点击