Oracle 字符串分割排序冒泡算法
                        
                            时间:2021-07-01 10:21:17
                            帮助过:3人阅读
							                        
                     
                    
                    
                    ------------------------------------------------------
-- Export file for user BEN                           --
-- Created by Administrator on 2015/8/5 星期三, 10:24:20 --
--------------------------------------------------------
set define 
off
spool get_bubble.log
prompt
prompt Creating function GET_BUBBLE
prompt ============================
prompt
create or replace function Get_BUBBLE
(
  av_str varchar2,  
--要分割的字符串
  av_split 
varchar2  --分隔符号
)
return varchar2
is
  lv_str varchar2(
1024); 
  str  varchar2(
1024); 
  str1 varchar2(
1024); 
--进行交换的第一个子串
  str2 
varchar2(
1024); 
--进行交换的第二个子串
  temp varchar2(
1024); 
--临时交换中间空间
  new_str 
varchar2(
1024); 
--内层循环每次交换的最大值
  all_str 
varchar2(
1024); 
--保存每次循环后生成的新串
  end_str 
varchar2(
1024); 
--最终值,返回值
  lv_length 
number; 
--分割后的子串个数
  jflag 
char(
1); 
--每次外循环后首次内循环的标识
  i 
number :
= 0; 
--外循环控制
  j 
NUMBER :
= 0; 
--内循环控制
  x 
number;  
--首次内循环第一个子串截取位置
  k 
number;  
--首次内循环第二个子串截取位置
  y 
number;  
  z number;  
--非首次内循环子串截取的位置
begin
  lv_str    := ltrim(
rtrim(av_str)); 
--去前后空格
  str       :
= lv_str;
  lv_length := 0;
  ----分割串【得到子串个数】
  while instr(
str,av_split)
<>0 loop
     lv_length:=lv_length
+1;
     str:
=substr(
str,instr(
str,av_split)
+length(av_split),length(
str));
  end loop;
  lv_length:=lv_length
+1; 
  if lv_length 
<= 1 then
    return ‘分割后只有一个子串‘;
  end if;
------------------------------------------------  
  end_str :
= ‘‘;
  <<loop1
>>
  loop --外循环
    if i 
< lv_length 
then
      j := i
+1; 
      jflag := 0;
      new_str := ‘‘;
      all_str := ‘‘;
      <<loop2
>>
      loop --内循环
        if j 
< lv_length 
then
          if jflag 
= 0 then -- 首次内循环(方便处理子串的拼接问题)
            select instr(lv_str, av_split, 
1) 
into x 
from dual;
            str1 := substr(lv_str, 
1, x
-1);
            --decode处理最后一个子串截取位置为0的问题
            select decode(instr(lv_str, av_split, x
+length(av_split)),
0,length(lv_str)
+1,instr(lv_str, av_split, x
+length(av_split))) 
into k 
from dual;
            str2 := substr(lv_str, x
+length(av_split), k
-x
-length(av_split));
            select count(
*) 
into y 
from dual 
where str1 
> str2;
            if y 
> 0 then
              new_str := str1;
              temp :
= str1;
              str1 := str2;
              str2 := temp;      
            else
              new_str := str2;
            end if;
            all_str := str1; 
            jflag := 1;
          else --非首次
            str1 :
= new_str; 
--上次比较后的最大值作为这次比较的前一个值
            select decode(instr(lv_str, av_split, k
+length(av_split)),
0,length(lv_str)
+1,instr(lv_str, av_split, k
+length(av_split))) 
into z 
from dual;
            str2 := substr(lv_str, k
+length(av_split), z
-k
-length(av_split)); 
--第二个
            k :
= z; 
-- z赋给k,方便下一次截取str2
            select count(
*) 
into y 
from dual 
where str1 
> str2;
            if y 
> 0 then
              new_str := str1;
              temp :
= str1;
              str1 := str2;
              str2 := temp;      
            else 
              new_str := str2;
            end if;
            all_str := all_str
||av_split
||str1; 
          end if;
        end if;
        j := j
+1;
        exit loop2 
when j 
>= lv_length;
        
      end loop loop2;
      lv_str := all_str
||av_split
||new_str; 
--上一轮内循环生成的新串
      
      if end_str 
is null then --最终的子串处理
        end_str :
= new_str;
      else
        end_str := new_str
||av_split
||end_str;
      end if;
           
   end if;
    i := i
+1;
    exit when i 
>= lv_length
-1;
  end loop loop1;
  end_str := str1
||av_split
||end_str; 
--返回前拼接上最后一个值
  return  end_str;
end Get_BUBBLE;
/
spool off
 
Oracle 字符串分割排序冒泡算法
标签: