--1.首先定义一个数组类型:
CREATE OR REPLACE TYPE "VARCHAR2VARRAY" IS VARRAY(8000) of VARCHAR2(4000)
--2.然后定义一个函数:
CREATE OR REPLACE FUNCTION sf_split_string(string VARCHAR2,
substring VARCHAR2)
RETURN Varchar2Varray IS
len integer := LENGTH(substring);
lastpos integer := 1 - len;
pos integer;
num integer;
i integer := 1;
ret Varchar2Varray := Varchar2Varray(4000);
BEGIN
LOOP
pos := instr(string, substring, lastpos + len);
IF pos > 0 THEN
--found
num := pos - (lastpos + len);
ELSE
--not found
num := LENGTH(string) + 1 - (lastpos + len);
END IF;
IF i > ret.LAST THEN
ret.EXTEND;
END IF;
ret(i) := SUBSTR(string, lastpos + len, num);
EXIT WHEN pos = 0;
lastpos := pos;
i := i + 1;
END LOOP;
RETURN ret;
END;
--测试:
declare
ret Varchar2Varray := Varchar2Varray(NULL);
i number;
begin
i := 1;
ret := sf_split_string('你、我、他', '、'); --获得分割数组
while i <= ret.count loop
dbms_output.put_line(ret(i));
i := i + 1;
end loop;
end;
--具体例子:
create or replace function func_isexists(v_str1 varchar2,
v_str2 varchar2,
v_complete out varchar2,
v_nocomplete out varchar2)
return varchar2 is
--判断字符串2是否完全存在于字符串1
--例子:v_str1=abcdefg v_str2=a、b 则返回 1,因为 a 和 b 都存在于 v_str1
--例子: v_str1=abcdefg v_str2=a、h 则返回 0,因为 h 不存在于 v_str1
ret Varchar2Varray := Varchar2Varray(NULL);
i integer;
j integer;
v_returnvalue varchar2(1);
begin
v_returnvalue := 0;
if v_str1 = '' or v_str1 is NULL then
v_complete := '';
v_nocomplete := v_str2;
return '0';
end if;
if v_str2 = '' or v_str2 is NULL then
v_complete := '';
v_nocomplete := '';
return v_returnvalue;
end if;
ret := sf_split_string(v_str2, '、'); --获得分割数组
i := ret.count;
j := 1;
loop
--只要有一个不存在就错误,返回 0
if Instr(v_str1, ret(j)) = 0 then
v_returnvalue := 0;
v_nocomplete := v_nocomplete || ret(j) || '、'; --记录不存在的项
--exit;
else
v_complete := v_complete || ret(j) || '、'; --记录已经存在的项
end if;
j := j + 1;
if j > i then
EXIT;
end if;
end loop;
return v_returnvalue;
end;