最近寫了一個把撈出來的資料,先做文字分割後,再 insert 進db 的語法,大概就又用到幾個東西~
整個大概就長成這樣子...
for rec in (
select distinct column_value
from table(
select SPLIT_TEXT(BB,';') as str
from TABLE1
where AA = ?)
)
loop
insert into TABLE2 (DD, EE, FF)
values (to_char(sysdate, 'YYYYMMDDHH24MISS'),
rec.column_value,
replace(replace(replace(P_DATA, '$1', P_S1), '$2', P_S2),'$3', P_S3)
);
end loop;
----------------------------------------------
一開始將文字資料依分隔符號拆解...
之前查詢可以用 with... 但是因為在 procedure內,好像不能用with...所以就抄一個現成的把split 的寫成 function給 procedure呼叫...
CREATE OR REPLACE FUNCTION SPLIT_TEXT(P_STR VARCHAR2, P_SEP VARCHAR2)
RETURN TYPE_SPLIT
PIPELINED IS
V_IDX PLS_INTEGER;
V_LIST VARCHAR2(32767) := P_STR;
BEGIN
LOOP
V_IDX := INSTR(V_LIST, P_SEP);
IF V_IDX > 0 THEN
PIPE ROW(SUBSTR(V_LIST, 1, V_IDX - 1));
V_LIST := SUBSTR(V_LIST, V_IDX + LENGTH(P_SEP));
ELSE
PIPE ROW(V_LIST);
EXIT;
END IF;
END LOOP;
END;
因為資料列表 用 collection 的方式擠在一個欄位回傳出來...
然後因為他只是一筆資料,要把他再展開成多筆資料時的寫法~
select distinct column_value
from table(
select SPLIT_TEXT(BB,';') as str
from MY_TABLE
where AA = ?)
另外一個就比較普通是 內容置換,只是如果置換很多的話,就會連成一長串
replace(replace(replace(P_DATA, '$1', P_S1), '$2', P_S2),'$3', P_S3)