- --创建pack spec
- create or replace package yhef_test is
- --构建索引表
- TYPE t_Array IS TABLE OF VARCHAR2(4000) index by binary_integer;
- -- Purpose 实现类似java的split函数
- -- parameter pi_str需要操作的字符串
- -- parameter pi_separator 分隔符
- function fn_split(pi_str In Varchar2, pi_separator In Varchar2)
- RETURN t_Array;
- end yhef_test;
- --创建pack body
- create or replace package body yhef_test is
- -- Purpose 实现类似java的split函数
- -- parameter pi_str需要操作的字符串
- -- parameter pi_separator 分隔符
- FUNCTION fn_split(pi_str In Varchar2, pi_separator In Varchar2)
- RETURN t_Array IS
- idx Number; --分隔符在字符串中的位置
- currentindex Number := 1; --数组的索引
- strs t_Array; --返回值
- v_str varchar2(4000) := pi_str; --临时变量
- BEGIN
- IF pi_str IS NOT NULL AND pi_separator IS NOT NULL THEN
- --存在分隔符
- IF INSTR(v_str, pi_separator) <> 0 THEN
- LOOP
- EXIT WHEN v_str IS NULL;
- EXIT WHEN INSTR(v_str, pi_separator) = 0;
- idx := INSTR(v_str, pi_separator);
- --截取字符串赋值给对应的数组
- strs(currentindex) := SUBSTR(v_str, 0, idx - 1);
- currentindex := currentindex + 1;
- --更新字符串
- v_str := SUBSTR(v_str, idx + 1);
- END LOOP;
- END IF;
- END IF;
- --如果分隔符为空,则直接返回字符串
- IF v_str IS NOT NULL THEN
- strs(currentindex) := v_str;
- END IF;
- Return strs;
- END fn_split;
- end yhef_test;
- --test
- declare
- ret yhef_test.t_array;
- begin
- -- Call the function
- ret := yhef_test.fn_split('a,b,c,d,e', ',');
- for i in 1 .. ret.count loop
- dbms_output.put_line(i || '=' || ret(i));
- end loop;
- end;