首先在SQL窗口创建table类型变量,用来声明函数返回的数组类型:
/*变量类型声明*/
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);
/*INSTR(x, find_string [, start] [, occurrence]);搜索find_string在x中并返回它出现的位置*/
/*如果String2在String1中没有找到,instr函数返回0*/
IF j = 0 THEN
j := len;
/*j等于待分割的字符串最后一个位置*/
str := SUBSTR (p_str, i);
/*str等于将待分割字符串从i位置分割到结束位置*/
/*添加到数组*/
str_split.EXTEND;
str_split (str_split.COUNT) := str;
/*数组.count可以获取到数组实际长度*/
/*i代表待分割的字符串开始分割的位置,len代表待分割字符串长度或结束位置,如果待分割的字符串开始分割的位置>=待分割字符串长度或结束位置则分割结束,退出循环*/
IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
/*SUBSTR(x, start [, length]); 返回x的一个子开始于由start指定的位置。可选长度为子字符串*/
/*i变成j+分割符长度的位置*/
i := j + len1;
/*添加到数组*/
str_split.EXTEND;
str_split (str_split.COUNT) := str;
END IF;
END LOOP;
RETURN str_split;
END fn_split;
测试代码:
/*测试代码*/
declare
-- Non-scalar parameters require additional processing
s ty_str_split;
len INTEGER;
begin
-- Call the function
s := fn_split('1,2,3',',');
len :=s.count;
dbms_output.put_line('数组长度:'||len);
FOR i IN 1..len
LOOP
dbms_output.put_line(s(i));
END LOOP;
end;
输出:
参考易百教程