一個比較複雜的多次拆分字串的儲存過程
自己寫的特殊拆分函式如下:
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_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||' ');
/* 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;
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_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||' ');
/* 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;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26230597/viewspace-1139367/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一個比較不錯的儲存過程分頁儲存過程
- mysql多次呼叫儲存過程的問題MySql儲存過程
- 探討一個比較複雜的查詢
- MySql儲存過程—2、第一個MySql儲存過程的建立MySql儲存過程
- SQL儲存過程【筆記】一個較簡單的庫存月結SQL儲存過程筆記
- 一些比較常見的SQL Server擴充套件儲存過程SQLServer套件儲存過程
- 一個儲存過程的問題!儲存過程
- 一個字串比較的題字串
- hibernate如何處理儲存過程中的複雜邏輯儲存過程
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- SQL分隔字串的儲存過程 (轉)SQL字串儲存過程
- oracle中發郵件的儲存過程--功能比較強(摘)Oracle儲存過程
- mssql 儲存過程呼叫另一個儲存過程中的結果的方法分享SQL儲存過程
- 儲存過程中拼接字串儲存過程字串
- 最近解決了一個比較複雜的“死鎖”問題
- laravel建立一個儲存過程Laravel儲存過程
- 學習一個簡單的儲存過程儲存過程
- SQL Server 比較兩個資料庫的檢視和儲存過程結構差異SQLServer資料庫儲存過程
- 如何將複雜的應用邏輯從儲存過程移植到業務層儲存過程
- 有關於儲存過程的一個笑話儲存過程
- 一個儲存過程編譯HANG住的分析儲存過程編譯
- 從sybase的儲存過程轉向oracle的儲存過程儲存過程Oracle
- MySQL儲存過程-->長字串扯分MySql儲存過程字串
- 一個有趣的問題: 如何用HashSet來儲存重複的字串?字串
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- 查詢當前資料庫存在某個字串的儲存過程資料庫字串儲存過程
- 接到第一個任務……過程比較曲折……
- oracle的儲存過程Oracle儲存過程
- 修改的儲存過程儲存過程
- mysql的儲存過程MySql儲存過程
- 一個SQL Server Sa密碼破解的儲存過程SQLServer密碼儲存過程
- 在儲存過程A中呼叫儲存過程B的結果儲存過程
- 儲存過程呼叫其他模式的儲存過程需要注意的地方儲存過程模式
- 轉化某個字母字串為反向大小寫儲存過程字串儲存過程
- 寫了一個MySQL的行轉列的儲存過程薦MySql儲存過程
- mysql返回一個結果集的儲存過程小例子MySql儲存過程
- Mysql 的儲存過程和儲存函式MySql儲存過程儲存函式
- MySQL儲存過程詳解 mysql 儲存過程MySql儲存過程