oracle 分割动态字符串为数组
2009-07-05 15:58
267 查看
--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;
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;
相关文章推荐
- [Oracle]分割字符串返回数组
- [Oracle]分割字符串返回数组
- 随笔 JS 字符串 分割成字符串数组 并动态添加到指定ID的DOM 里
- oracle根据分隔符将字符串分割成数组函数
- [Oracle]分割字符串返回数组
- ORACLE(PL/SQL) 根据字符分割(SPLIT)字符串返回数组
- oracle基础三 与长字符串根据操作符分割成数组处理函数
- 分割字符串成数组并返回数组的长度(Oracle)
- 根据分隔符将一个长字符串分割保存到动态数组中
- 根据分隔符将一个长字符串分割保存到动态数组中
- 根据分隔符将一个长字符串分割保存到动态数组中(第二种方法)
- oracle 使用存储过程分割字符串为数组
- oracle怎么切割一个指定的字符串按指定的标志符分割成字符数组
- 根据分隔符将一个长字符串分割保存到动态数组中(第二种方法)
- sql按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便
- JAVA中 我要将字符串以空格为标记分割成多个字符串,并将分割后的字符串设为一个字符串数组
- Oracle把逗号分割的字符串转换为可放入in的条件语句的字符数列
- Oracle 字符串分割的处理
- c语言实现遍历字符串并分割成数组
- 关于指针 用字符数组,字符指针变量输入字符串 动态为字符型指针变量分配内存