Oracle中的Split函数

首先需要定义 2 个类型
1. Row 类型
CREATE OR REPLACE TYPE ty_row_str_split  as object (strValue VARCHAR2 (4000))
2. Table 类型
CREATE OR REPLACE TYPE ty_tbl_str_split IS TABLE OF ty_row_str_split

创建函数:
CREATE OR REPLACE FUNCTION fn_split(p_str       IN VARCHAR2,
                                    p_delimiter 
IN VARCHAR2)
  
RETURN ty_tbl_str_split IS
  j         
INT := 0;
  i         
INT := 1;
  
len       INT := 0;
  len1      
INT := 0;
  
str       VARCHAR2(4000);
  str_split ty_tbl_str_split :
= ty_tbl_str_split();
BEGIN
  
len  := LENGTH(p_str);
  len1 :
= LENGTH(p_delimiter);


  
WHILE j < len LOOP
    j :
= INSTR(p_str, p_delimiter, i);
  
    
IF j = 0 THEN
      j   :
= len;
      
str := SUBSTR(p_str, i);
      str_split.EXTEND;
      str_split(str_split.
COUNT) := ty_row_str_split(strValue => str);
    
      
IF i >= len THEN
        
EXIT;
      
END IF;
    
ELSE
      
str := SUBSTR(p_str, i, j - i);
      i   :
= j + len1;
      str_split.EXTEND;
      str_split(str_split.
COUNT) := ty_row_str_split(strValue => str);
    
END IF;
  
END LOOP;


  
RETURN str_split;
END fn_split;


使用样例:
select to_number(strvalue) as Value from table(fn_split('1,2,3',','))

select to_char(strvalue) as Value from table(fn_split('aa,bb,cc',','))
---------------------------------------------------
*****************************************
方法2:
----------------------------------------------------
CREATE OR REPLACE TYPE type_split IS TABLE OF VARCHAR2 (4000)

 

代码
create or replace function split(p_list varchar2,p_sep varchar2 := ','return type_split pipelined
IS
 l_idx pls_integer;
 v_list 
varchar2(4000) := p_list;
 
begin
      loop
           l_idx :
= instr(v_list,p_sep);
           
if l_idx > 0 then
               
pipe row(substr(v_list,1,l_idx-1));
               v_list :
= substr(v_list,l_idx+length(p_sep));
           
else
                
pipe row(v_list);
                
exit;
           
end if;

      
end loop;


      
return;
 
end split;

 

posted @ 2009-07-23 15:27  三月三  阅读(24717)  评论(0编辑  收藏  举报