oracle split 函数 返回数组
- 格式:docx
- 大小:25.30 KB
- 文档页数:4
oracle split 函数返回数组
最近在oracle 中用到拆分字符串返回数组,一直头痛,因为在oracle 中没有类似java中有split 函数,所以要自己写。
好不容搜到一个。
那网上是到处都是这个代码。
怎么找都是这个方法,我就用了。
这个方法如下:(方法一)用到后面出现了bug 。
哎弄了一下午就给别人测试了一下bug。
(方法一)根本就行不通。
于是我就自己改写了。
(方法二)大家如有需要的请参考方法二:
如果用方法一来分隔字符串。
比如我需要分隔的字符串为”a,b,c,d/e,f,g,h/i,j,k,l”
分隔符为"/" ,分割后的数组,只有两组,最后一组消失了!
如果我需要分隔的字符串为”a,b,c,d”
分隔符为"/",分隔后的数组,就没有问题。
方法一(相信大家在网上已经搜到不少了,也看到不少了。
)
(方法一)
CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN ty_str_split
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
str_split ty_str_split := ty_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 := len;
str := SUBSTR (p_str, i);
str_split.EXTEND;
str_split (str_split.COUNT) := str;
IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
str_split.EXTEND;
str_split (str_split.COUNT) := str;
END IF;
END LOOP;
RETURN str_split;
END fn_split;
/
测试:
DECLARE
CURSOR c
IS
SELECT *
FROM TABLE (CAST (fn_split ('1;;12;;123;;1234;;12345', ';;') AS ty_str_split
)
);
r c%ROWTYPE;
BEGIN
OPEN c;
LOOP
FETCH c INTO r;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.put_line (r.column_value);
END LOOP;
CLOSE c;
END;
/
结果:
1
12
123
1234
12345
方法二
第一:先在TYPE 里面建一个table
注意TABLE OF VARCHAR2(200); 取决于你的字符串的长度。
CREATE OR REPLACE TYPE LW.T_VARRAY
IS
TABLE OF VARCHAR2(200);
/
第二:在FUNCTION里面开始写方法
两个参数P_LIST 为传进去需要拆分的字符串
P_SEP 为选择根据什么字符来分隔
CREATE OR REPLACE FUNCTION LW.STR_SPLIT(P_LIST IN VARCHAR2,P_SEP IN VARCHAR2) RETURN T_VARRAY IS
L_IDX PLS_INTEGER;
V_LIST VARCHAR2(250) := P_LIST;
RES VARCHAR2(250);
J NUMBER(4):=1;
CSTR T_VARRAY := T_VARRAY(); --声明集合
BEGIN
LOOP
L_IDX := INSTR(V_LIST, P_SEP);
IF L_IDX > 0 THEN
RES := SUBSTR(V_LIST, 1, L_IDX - 1);
CSTR.EXTEND(1);
CSTR(J) := RES;
V_LIST := SUBSTR(V_LIST, L_IDX + LENGTH(P_SEP));
ELSE
RES := V_LIST;
CSTR.EXTEND(1);
CSTR(J) := RES;
EXIT;
END IF;
J :=J+1;
END LOOP;
RETURN CSTR;
END STR_SPLIT;
/。