您的位置:首页 > 数据库 > Oracle

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;

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息