將在一列的以逗號隔開的列數據轉化為行數據顯示的函數
<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;