一個比較復雜的多次拆分字符串的存儲過程

自己寫的特殊拆分函數如下:?
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 分享