一个比较复杂的多次拆分字符串的存储过程

自己写的特殊拆分函数如下: 
create or replace function fn_split_str_2(var_str   in varchar2)return varchar2
/* 
有一张表 t1,里面有个字段叫c3,存的是所有店铺的点位信息。
现在需要一个存储过程,将所有的记录的c3字段的坐标值都缩小3倍,写入c字段

内容举例为  220.25 257,220.25 269.75,229.25 269.75,229.25 257
每个逗号分开的是一个个的坐标点,每个坐标点用空格区分x坐标和y坐标

存储函数名称:fn_split_str_2
用途:把bis_store坐标v_coords3缩小三倍更新coords,比如
author:huangshan
*/

as    var_tmp     varchar2(4000);    var_element varchar2(4000);    var_result varchar2(4000);    var_instr_first number;    var_instr_second number;    var_length number;

begin

  var_tmp := var_str;    var_instr_first :=0;    var_instr_second :=0;    var_result :='';    var_length:=0;


  
  /* 替换掉传过来的特殊字符
chr(9) 制表符 
chr(10)回车
chr(13)换行
  */

  var_tmp:= replace(var_tmp,chr(10),'');    var_tmp:= replace(var_tmp,chr(13),'');    var_tmp:= replace(var_tmp,chr(9),'');        while instr(var_tmp, ' ') > 0       or instr(var_tmp, ',')>0       or(var_length>0) loop      var_instr_first :=instr(var_tmp, ' ');      var_instr_second :=instr(var_tmp, ',');     -- dbms_output.put_line('var_instr_kg:'||var_instr_first||'  ');     -- dbms_output.put_line('var_instr_dh:'||var_instr_second||'  ');           var_length:=length(var_tmp);     --  dbms_output.put_line('var_length  :'||var_length||'  ');


     
/* 1 如果是先有空格,比如 12 32,12 32这类 **/
 

  if var_instr_first<var_instr_second><p><span style="font-family: 'sans serif', tahoma, verdana, helvetica; line-height: 18px;"></span><br><span style="font-family: 'sans serif', tahoma, verdana, helvetica; line-height: 18px;"> </span><br><span style="font-family: 'sans serif', tahoma, verdana, helvetica; line-height: 18px;">      /* 2 如果是已经截取完空格,逗号在前面比如 32,12 32这类 **/    </span><br><span style="font-family: 'sans serif', tahoma, verdana, helvetica; line-height: 18px;">  </span></p> <pre class="brush:php;toolbar:false">  elsif var_instr_first&gt;var_instr_second and  var_instr_second&gt;0 then             var_element := round(to_number(substr(var_tmp, 1, var_instr_second-1))/3,2);             var_result := var_result || var_element || ',' ;             var_tmp := substr(var_tmp,var_instr_second+1, length(var_tmp));           --  dbms_output.put_line('var_result dh:'||var_result);          --   dbms_output.put_line('var_tmp dh:'||var_tmp||'  ');          --   dbms_output.put_line('var_element dh:'||var_element||'  ');

/* 3 如果是已经截取完逗号,已经只剩下最后一个坐标x y,比如12 32这类 **/  
   

 elsif var_instr_first&gt;var_instr_second and  var_instr_second=0 then           var_element := round(to_number(substr(var_tmp, 1, var_instr_first-1))/3,2);           var_result := var_result|| var_element|| ' ';           var_tmp := substr(var_tmp,+1, length(var_tmp));         --  dbms_output.put_line('var_result kg:'||var_result);         --  dbms_output.put_line('var_tmpvar_instr_first kg:'||var_tmp||'  ');          -- dbms_output.put_line('var_element kg:'||var_element||'  ');


        
/* 4 如果是已经截取到最后一个坐标,比如32这类 **/ 
 

    elsif var_instr_first=0 and var_instr_second=0 and var_length&gt;0 then        --  dbms_output.put_line('var_tmp the last one:'||var_tmp||'  ');         var_element := round(to_number(var_tmp)/3,2);         var_result := var_result  || var_element;         var_tmp:='';         --  dbms_output.put_line('var_result 0:'||var_result);         --  dbms_output.put_line('var_tmp 0:'||var_tmp||'  ');         --  dbms_output.put_line('var_element 0:'||var_element||'  ');


 
/* 5 如果其他的东西,设置成”退出while循环为止 **/ 

     else          var_tmp:='';       end if;      -- dbms_output.put_line('     ');           end loop;    return var_result;  end FN_SPLIT_STR_2;

— google其他人的拆分function如下:
— 拆分函数

create or replace function split_str(var_str   in varchar2,                                          var_split in varchar2)   /****************************************************     注意 先执行下面语句 创建类型     create or replace type t_ret_table is table of varchar2(100)     ** 函数名称:split_str     ** 参    数:【名称】         【类型 】      【说明】     **           var_str          varchar2       要拆分的字符串     **           var_split        varchar2       字符串分隔符     ** 返 回 值:Result           t_ret_table    拆分后数组集合     ** 摘    要:拆分字符串     调用 举例:     select * from table(split_str('2008-10-21','-'))     ****************************************************/     return t_ret_table is     var_out     t_ret_table;     var_tmp     varchar2(4000);     var_element varchar2(4000);

begin 
 

 var_tmp := var_str;     var_out := t_ret_table();     --如果存在匹配的分割符     while instr(var_tmp, var_split) &gt; 0 loop       var_element := substr(var_tmp, 1, instr(var_tmp, var_split) - 1);       var_tmp     := substr(var_tmp,                             instr(var_tmp, var_split) + length(var_split),                             length(var_tmp));       --var_out.extend(1);       var_out.extend;       var_out(var_out.count) := var_element;     end loop;     --var_out.extend(1);     var_out.extend;     var_out(var_out.count) := var_tmp;     return var_out;   end split_str;

 以上就是一个比较复杂的多次拆分字符串的存储过程的内容,更多相关内容请关注PHP中文网(www.php.cn)!

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享