方法一:
create or replace type tab_split_list is table of varchar2(200); --创建变量
/******************************************************************************
-- 工具类
分割字符串 调用方法例如
SELECT COLUMN_VALUE AS a FROM TABLE(get_split_lists('25#1','#'));
-- 输入参数:
-- i_date
-- 输出参数
-- o_retCode 返回标志位
-- totalNum 返回总条数
-- REVISIONS:
-- Ver Date Author Description
-- --------- ---------- ---------- --------------------------
-- 1.0 2015-04-21 jiajitao create this procedure.
******************************************************************************/
FUNCTION get_split_lists(i_str varchar2,i_delimiter varchar2) RETURN tab_split_list IS
v_list tab_split_list;
begin
SELECT aa.s BULK COLLECT INTO v_list FROM(
SELECT REGEXP_SUBSTR(ONAME, '[^'||i_delimiter||']+', 1, ROWNUM) AS s
FROM (SELECT i_str AS ONAME FROM DUAL)
CONNECT BY ROWNUM <=LENGTH(REGEXP_REPLACE(ONAME, '[^'||i_delimiter||']+')) + 1
) aa WHERE aa.s IS NOT NULL;
RETURN v_list;
END get_split_lists;
方法二
--创建变量
CREATE OR REPLACE TYPE "ARRYTYPE1" IS VARRAY(10000) OF VARCHAR(2000);
--创建函数
CREATE OR REPLACE FUNCTION FUNC_ISM_GETSPLITSTR (
in_str IN VARCHAR2, --需分割的字符串
in_split IN VARCHAR2 --分隔符
)
RETURN arrytype1
AS
v_count1 INTEGER;
v_count2 INTEGER;
v_strlist arrytype1;
v_node VARCHAR2 (2000);
BEGIN
v_count2 := 0;
v_strlist := arrytype1 ();
IF (in_str IS NULL) OR (LENGTH (in_str) <= 0)
THEN
RETURN NULL;
END IF;
FOR v_i IN 1 .. LENGTH (in_str)
LOOP
v_count1 := INSTRB (in_str, in_split, 1, v_i);
v_count2 := INSTRB (in_str, in_split, 1, v_i + 1);
v_node := SUBSTRB (in_str, v_count1 + 1, v_count2 - v_count1 - 1);
IF v_node IS NULL
THEN
v_node := '';
END IF;
IF (v_count2 = 0) OR (v_count2 IS NULL)
THEN
EXIT;
ELSE
v_strlist.EXTEND ();
v_strlist (v_i) := v_node;
v_node := '';
END IF;
END LOOP;
RETURN v_strlist;
END FUNC_ISM_GETSPLITSTR;
--测试
SELECT * FROM TABLE( FUNC_ISM_GETSPLITSTR('_FUNC_CTP_LG_GEsss_s_ssssTSPNG_', '_'));