從Oracle中替換用逗號串接的字串值

  • 3782
  • 0
  • 2012-04-20

從Oracle中替換用逗號串接的字串值

Dotblogs 的標籤: , ,

 

Oracle沒有提供Split的功能,原本OWNERS欄位存的是A,C,E,F這樣的值,現在要把A換成LEO_A,B換成LEO_B,以此類推。要透過DB端直接修改(就是要整檔嚕~),有人建議用REPLACE的方式處理,但是因為執行順序的關係,有可能造成錯誤的置換,例如:B換成LEO_B,然後置換E->LEO_E時,會把剛剛的「LEO_B」變成「LLEO_EO_B」,因此我寫了以下的範例,請同事去改一下。

因為只 FOR 整檔用,就沒寫的太漂亮啦~省時間比較重要 XD


DECLARE 
  CURSOR CSR_POWER IS SELECT OWNERS FROM MY_POWER WHERE SEQ = '6';
  RS_POWER CSR_POWER%ROWTYPE;
  I INTEGER;
  RTRN VARCHAR(2000);
BEGIN

  OPEN CSR_POWER;
  LOOP
    FETCH CSR_POWER INTO RS_POWER;
    EXIT WHEN CSR_POWER%NOTFOUND;
    I := INSTR(RS_POWER.OWNERS, 'A');
    IF I > 0 THEN
      RTRN := RTRN || 'LEO_A' || ',';
    END IF;
    I := INSTR(RS_POWER.OWNERS, 'B');
    IF I > 0 THEN
      RTRN := RTRN || 'LEO_B' || ',';
    END IF;
    I := INSTR(RS_POWER.OWNERS, 'C');
    IF I > 0 THEN
      RTRN := RTRN || 'LEO_C' || ',';
    END IF;
    I := INSTR(RS_POWER.OWNERS, 'D');
    IF I > 0 THEN
      RTRN := RTRN || 'LEO_D' || ',';
    END IF;
    I := INSTR(RS_POWER.OWNERS, 'E');
    IF I > 0 THEN
      RTRN := RTRN || 'LEO_E' || ',';
    END IF;
    I := INSTR(RS_POWER.OWNERS, 'F');
    IF I > 0 THEN
      RTRN := RTRN || 'LEO_F' || ',';
    END IF;
    DBMS_OUTPUT.put_line(RTRN);
  END LOOP;
END;

--------
沒什麼特別的~
不過是一些筆記而已