CREATE OR REPLACE TYPE splitArray AS TABLE OF VARCHAR2(2048);
--------字符串拆分函数
CREATE OR REPLACE FUNCTION fu_split_Array (
str IN VARCHAR2,--输入的字符串
split_param IN VARCHAR2 --拆分的参数
)
RETURN splitArray
IS
split_array splitArray := splitArray();--定义拆分数组
t_temp VARCHAR2(2048);
t_begin number :=0;--循环变量开始参数
t_end number := 1;--截取字符长度的开始位置结束参数
t_length number :=0;--字符串的长度
t_paramLength number :=0;--传入字符串截取参数的长度
BEGIN
t_length := length(str);--获取传入字符的长度
t_paramLength := length(split_param);--截取参数的长度
--在temp 变量中查找 split_param 检索当前split_param字符串的位置 如果没有找到则返回0
WHILE t_begin < t_length LOOP
dbms_output.put_line('截取='||t_begin);
--起始位置从1开始截取匹配split_param字符串并返回他所在的位置
t_begin := instr(str,split_param,t_end);
/* IF t_begin = 0 THEN Dbms_Output.put_line('见到了'); t_begin := t_length; t_temp := SUBSTR (str, t_end); split_array.extend; split_array (split_array.count) := str; IF t_end >= t_length THEN Dbms_Output.put_line('见到了11111111111'); EXIT; END IF; ELSE*/ --判断当前是否长度超出原字符串长度 如果超出则不执行 IF t_end >= t_length THEN --Dbms_Output.put_line('见到了11111111111'); EXIT; END IF; t_temp := SUBSTR(str,t_end,t_begin-t_end); --dbms_output.put_line(t_temp); t_end := t_begin+t_paramLength; split_array.extend; split_array(split_array.count) := t_temp; /*END IF;*/ END LOOP;
RETURN split_array;
END fu_split_Array;
--测试
SELECT fu_split_Array('A,B,C,D,E,',',') FROM DUAL;
备注 :如果你的字符串最后一位含有分隔符例如“,”之类的标示 则使用红色未注释部分
如果你的字符串最后一位没有标记 则使用橘色注释部分代码 则返回所有的字符串你就需要重新截取最后一位了目前
我只了解这些 还在测试阶段 完善了全部黏贴出来 谢谢!希望对您有帮助!