oracle進行字符串拆分並組成數組


CREATE OR REPLACE TYPE CUX_STR_SPLIT_TYPE IS TABLE OF VARCHAR2 (4000);

 

CREATE OR REPLACE PACKAGE cux_char_handle_util_pkg IS

  TYPE char_var_type IS RECORD(
    char_value VARCHAR2(200));

  TYPE char_var_tbl IS TABLE OF char_var_type INDEX BY BINARY_INTEGER;

  g_char_var_tbl char_var_tbl;

  FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2)
    RETURN cux_str_split_type
    PIPELINED;

  PROCEDURE prepare_char_value(p_str_var VARCHAR2, p_delimiter IN VARCHAR2);

  FUNCTION make_char_str(p_str VARCHAR2, p_delimiter IN VARCHAR2)
    RETURN VARCHAR2;

END;

/
CREATE OR REPLACE PACKAGE BODY cux_char_handle_util_pkg IS

  --拆分字符串
  FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2)
    RETURN cux_str_split_type
    PIPELINED AS
    v_length NUMBER := length(p_string);
    v_start  NUMBER := 1;
    v_index  NUMBER;
  BEGIN
    WHILE (v_start <= v_length) LOOP
      v_index := instr(p_string, p_delimiter, v_start);
    
      IF v_index = 0 THEN
        PIPE ROW(substr(p_string, v_start));
        v_start := v_length + 1;
      ELSE
        PIPE ROW(substr(p_string, v_start, v_index - v_start));
        v_start := v_index + 1;
      END IF;
    END LOOP;
  
    RETURN;
  END;

   /******************************************************
    \
    \ 將字符串處理為全局數組變量g_char_var_tbl,
    \
    \
    \
    ********************************************************/
  PROCEDURE prepare_char_value(p_str_var VARCHAR2, p_delimiter IN VARCHAR2) IS
  
    CURSOR cur_cloumn(p_str VARCHAR2) IS
      SELECT column_value FROM TABLE(splitstr(p_str, p_delimiter));
    i NUMBER := 1;
  
    l_str_var VARCHAR2(240);
  BEGIN
  
    l_str_var := p_str_var;
  
    g_char_var_tbl.delete;
    OPEN cur_cloumn(l_str_var);
  
    LOOP
      FETCH cur_cloumn
        INTO g_char_var_tbl(i).char_value;
      EXIT WHEN cur_cloumn%NOTFOUND;
      i := i + 1;
    END LOOP;
    CLOSE cur_cloumn;
  
  END;

  /******************************************************
    \在某些情況下,例如2.12.15.1, 2.2.1, 2.2.1.5, 2.20.1.1
    \需要按每一段內的數字大小進行排序
    \
    \ 處理思路如下,將字符串按指定字符拆分到一個數組里面,並把每段左邊補0補齊至2位(按需調整)
    \ 將最后拼接的字符串向右補0,補齊至12位(按需調整,我本次的字符串不會超過6段)
    \ 
   \ 對於類型為字符串或者漢字的仍然通用(由於漢字占三個字符,所以lpad的長度需要滿足3*最大中文段長度),最后的排序結果為默認的oracle ansii排序,需要自己對中文再排序
   \ \ 最后在外層對返回的字符串進行排序即可 \ *******************************************************
*/ FUNCTION make_char_str(p_str VARCHAR2, p_delimiter IN VARCHAR2) RETURN VARCHAR2 IS v_str VARCHAR2(10); p_result_str VARCHAR2(50) := NULL; BEGIN --拆分字符串並拼接成數組,數組為全局變量g_char_var_tbl prepare_char_value(p_str, p_delimiter); FOR i IN 1 .. g_char_var_tbl.count LOOP --每段向左添加0補齊 v_str := lpad(g_char_var_tbl(i).char_value, 2, '0'); --拼接 p_result_str := p_result_str || v_str; END LOOP; --將最后結果向右添加0補齊至12位 p_result_str := rpad(p_result_str, 12, '0'); RETURN p_result_str; END; END;

 

示例

 SELECT cux_char_handle_util_pkg.make_char_str(csa.account_code, '.'),
       csa.head_id,
       csa.*
  FROM cux_cst_accounts csa
 WHERE csa.head_id = 28
   AND csa.account_code <> '根節點'
 ORDER BY csa.account_code

 

加入

SELECT cux_char_handle_util_pkg.make_char_str(csa.account_code, '.'),
       csa.head_id,
       csa.*
  FROM cux_cst_accounts csa
 WHERE csa.head_id = 28
   AND csa.account_code <> '根節點'
 ORDER BY cux_char_handle_util_pkg.make_char_str(csa.account_code, '.');

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM