將在一列的以逗號隔開的列資料轉化為行資料顯示的函數,逗號資料顯示
<pre name="code" class="sql">這個是字串分割函數的使用例子select to_number(strvalue) as Value from table(fn_split('1,2,3',',')) select to_char(strvalue) as Value from table(fn_split('aa,bb,cc',','))
</pre><pre name="code" class="sql">函數:
</pre><pre name="code" class="sql">CREATE OR REPLACE FUNCTION ROOT.fn_split( p_str IN VARCHAR2, p_delimiter IN VARCHAR2)RETURN ty_tbl_str_split IS j INT := 0; i INT := 1; -- 被分割的源字串 的長度. len INT := 0; -- 分隔字串的長度 len1 INT := 0; -- 暫存的中間每一個單元的文本資訊. str VARCHAR2(4000); -- 預期返回結果. str_split ty_tbl_str_split := ty_tbl_str_split();BEGIN -- 被分割的源字串 的長度. len := LENGTH(p_str); -- 分隔字串的長度. len1 := LENGTH(p_delimiter); -- 遍曆 被分割的源字串. WHILE j < len LOOP -- 在被分割的源字串中, 查詢 分隔字串. j := INSTR(p_str, p_delimiter, i); IF j = 0 THEN -- j=0 意味著沒有找到. -- 可以理解為是查詢到最後一個單元了. -- 設定 j := len, 讓外部的迴圈處理可以結束了. j := len; -- 擷取最後一個單元的內容. str := SUBSTR(p_str, i); -- 結果追加一行. str_split.EXTEND; -- 設定結果內容. str_split(str_split.COUNT) := ty_row_str_split(strValue => str); IF i >= len THEN EXIT; END IF; ELSE -- 如果在被分割的源字串中,找到了 分隔字串. -- 首先,擷取分割的內容. str := SUBSTR(p_str, i, j - i); -- 然後設定索引, 下一次再尋找的時候,從指定的索引位置開始(不是從0開始找了) i := j + len1; -- 結果追加一行. str_split.EXTEND; -- 設定結果內容. str_split(str_split.COUNT) := ty_row_str_split(strValue => str); END IF; END LOOP; RETURN str_split;END fn_split;