私が書いた特別な 分割関数は次のとおりです:
関数 FN_SPLIT_STR_2(var_str in varchar2)return varchar2
/* を作成または置換します
のフィールドc3 と呼ばれる関数には、すべての店舗の位置情報が保存されます。
今度は、すべてのレコードの c3 フィールドの座標値を 3 倍にして c フィールドに書き込むストアド プロシージャが必要です。内容はそれぞれ 220.25 257,220.25 269.75,229.25 269.75,229.25 257
です。カンマは座標点を 1 つずつ区切ります。各座標点はスペースを使用して x 座標と y 座標を区別します。
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||' ');
if var_instr_first<var_instr_second 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,var_instr_first+1, length(var_tmp)); -- dbms_output.put_line('var_result kg:'||var_result); -- dbms_output.put_line('var_tmp kg:'||var_tmp||' '); -- dbms_output.put_line('var_element kg:'||var_element||' ');
以上就是一个比较复杂的多次拆分字符串的存储过程的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!
/* などのスペースがあります。 2 スペースがインターセプトされている場合は、カンマが前にあります。として 32,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_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;