因轉檔程式需求改變,Stored Procedure由切割固定長度改由特殊符號分隔,所以找紀錄一下SQL語法
單純以欄位長度切割SQL:
select rtrim(ltrim(substr('20140701^080300^0026^11110007^4800361002974^雀巢 雀巢美祿可可球170g^20140730^^18^0^51.81^0^七日未到貨^307^93^7^18^0^10^0^',
10,6)))
from dual
以分隔符號切割SQL:
select
get_token('20140701^20140730^雀巢Test^^0^Test^311^97^7^15^0^11^0^',
2,'^')
from dual
function
CREATE OR REPLACE FUNCTION GET_TOKEN( IN_STR IN VARCHAR2 --字串
,IN_INDEX IN NUMBER --索引位置
,IN_DELIM IN VARCHAR2 := ',' --搜尋符號
) RETURN VARCHAR2 IS --符號間之子字串
/*
參數說明
傳入值 : 字串-要進行搜尋的字串
索引-要搜尋的第N個符號
符號-要搜尋的符號
傳回值 : 子字串-第N-1個符號到第N個符號間之字串
(08)輸入檔名 : 無
(09)輸出檔名 : 無
(10)輸入表單 :
(11)輸出表單 : 無
(12)處理說明 : 1.先取得第n-1個符號的位置
2.取得第n個符號的位置
3.取得第n-1個符號到第n個符號間之字串
(13)CALL 副程序 : 無
(14)修改明細 :
*/
START_POS NUMBER :=0;
END_POS NUMBER :=0;
BEGIN
--判別起始位置
IF IN_INDEX <= 0 THEN
RETURN NULL;
ELSIF IN_INDEX = 1 THEN
START_POS := 1;
ELSE
START_POS := INSTR(IN_STR,IN_DELIM,1,IN_INDEX - 1);
IF START_POS = 0 THEN
RETURN NULL;
ELSE
START_POS := START_POS + LENGTH(IN_DELIM);
END IF;
END IF;
--設定結束位置
END_POS := INSTR(IN_STR,IN_DELIM,START_POS,1);
--截取字串,並回傳結果
IF END_POS = 0 THEN
RETURN LTRIM(RTRIM(SUBSTR(IN_STR,START_POS),' '),' ');
ELSE
RETURN LTRIM(RTRIM(SUBSTR(IN_STR,START_POS,END_POS - START_POS),' '),' ');
END IF;
END GET_TOKEN;
/
請先 登入 以發表留言。