2016年6月17日 星期五

oracle plsql split string and for loop insert

 最近寫了一個把撈出來的資料,先做文字分割後,再 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)

沒有留言: