当前位置:Gxlcms > mysql > 一个比较复杂的多次拆分字符串的存储过程

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

时间:2021-07-01 10:21:17 帮助过:30人阅读

自己写的特殊拆分函数如下:
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
*/

  1. as
  2. var_tmp varchar2(4000);
  3. var_element varchar2(4000);
  4. var_result varchar2(4000);
  5. var_instr_first number;
  6. var_instr_second number;
  7. var_length number;




begin

  1. var_tmp := var_str;
  2. var_instr_first :=0;
  3. var_instr_second :=0;
  4. var_result :='';
  5. var_length:=0;



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

  1. var_tmp:= replace(var_tmp,chr(10),'');
  2. var_tmp:= replace(var_tmp,chr(13),'');
  3. var_tmp:= replace(var_tmp,chr(9),'');
  4. while instr(var_tmp, ' ') > 0
  5. or instr(var_tmp, ',')>0
  6. or(var_length>0) loop
  7. var_instr_first :=instr(var_tmp, ' ');
  8. var_instr_second :=instr(var_tmp, ',');
  9. -- dbms_output.put_line('var_instr_kg:'||var_instr_first||' ');
  10. -- dbms_output.put_line('var_instr_dh:'||var_instr_second||' ');
  11. var_length:=length(var_tmp);
  12. -- dbms_output.put_line('var_length :'||var_length||' ');



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

  1. if var_instr_first<var_instr_second then
  2. var_element := round(to_number(substr(var_tmp, 1, var_instr_first-1))/3,2);
  3. var_result := var_result|| var_element|| ' ';
  4. var_tmp := substr(var_tmp,var_instr_first+1, length(var_tmp));
  5. -- dbms_output.put_line('var_result kg:'||var_result);
  6. -- dbms_output.put_line('var_tmp kg:'||var_tmp||' ');
  7. -- dbms_output.put_line('var_element kg:'||var_element||' ');



/* 2 如果是已经截取完空格,逗号在前面比如 32,12 32这类 **/

  1. elsif var_instr_first>var_instr_second and var_instr_second>0 then
  2. var_element := round(to_number(substr(var_tmp, 1, var_instr_second-1))/3,2);
  3. var_result := var_result || var_element || ',' ;
  4. var_tmp := substr(var_tmp,var_instr_second+1, length(var_tmp));
  5. -- dbms_output.put_line('var_result dh:'||var_result);
  6. -- dbms_output.put_line('var_tmp dh:'||var_tmp||' ');
  7. -- dbms_output.put_line('var_element dh:'||var_element||' ');



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

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



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

  1. elsif var_instr_first=0 and var_instr_second=0 and var_length>0 then
  2. -- dbms_output.put_line('var_tmp the last one:'||var_tmp||' ');
  3. var_element := round(to_number(var_tmp)/3,2);
  4. var_result := var_result || var_element;
  5. var_tmp:='';
  6. -- dbms_output.put_line('var_result 0:'||var_result);
  7. -- dbms_output.put_line('var_tmp 0:'||var_tmp||' ');
  8. -- dbms_output.put_line('var_element 0:'||var_element||' ');



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

  1. else
  2. var_tmp:='';
  3. end if;
  4. -- dbms_output.put_line(' ');
  5. end loop;
  6. return var_result;
  7. end FN_SPLIT_STR_2;




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

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


begin

  1. var_tmp := var_str;
  2. var_out := t_ret_table();
  3. --如果存在匹配的分割符
  4. while instr(var_tmp, var_split) > 0 loop
  5. var_element := substr(var_tmp, 1, instr(var_tmp, var_split) - 1);
  6. var_tmp := substr(var_tmp,
  7. instr(var_tmp, var_split) + length(var_split),
  8. length(var_tmp));
  9. --var_out.extend(1);
  10. var_out.extend;
  11. var_out(var_out.count) := var_element;
  12. end loop;
  13. --var_out.extend(1);
  14. var_out.extend;
  15. var_out(var_out.count) := var_tmp;
  16. return var_out;
  17. end split_str;

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

人气教程排行