제가 작성한 특수 분할 함수는 다음과 같습니다.
함수 생성 또는 교체 FN_SPLIT_STR_2(var_str in varchar2)return varchar2
/*
모든 매장의 위치 정보를 저장하는 c3이라는 필드가 있는 테이블 t1이 있습니다.
이제 모든 레코드의 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을 3번 줄이고 와 같은 좌표를 업데이트합니다.
저자: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;
시작
/* 전달된 문자 바꾸기 특수 문자
chr(9) 탭 문자
chr(10) 캐리지 리턴
chr(13) 줄 피드
*/
/* 1 12 32,12 32**/
var_tmp := var_str; var_instr_first :=0; var_instr_second :=0; var_result :=''; var_length:=0;
와 같이 먼저 공백이 있는 경우
/* 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;
以上就是一个比较复杂的多次拆分字符串的存储过程的内容,更多相关内容请关注PHP中文网(www.php.cn)!