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