orcal中添加split函数

1.创建表类型
CREATE OR REPLACE TYPE "TYPE_SPLIT"   as table of varchar2(4000) ;
2.创建split 函数
CREATE OR REPLACE FUNCTION split(p_list VARCHAR2,
                                 p_sep  VARCHAR2 := ',') RETURN type_split
  PIPELINED IS
  l_idx  PLS_INTEGER;
  v_list VARCHAR2(4000) := p_list;
BEGIN
  IF p_list IS NULL
     OR p_list = '' THEN
    RETURN;
  END IF;
  LOOP
    l_idx := instr(v_list, p_sep);
    IF l_idx > 0 THEN
      PIPE ROW(substr(v_list, 1, l_idx - 1));
      v_list := substr(v_list, l_idx + length(p_sep));
    ELSE
      PIPE ROW(v_list);
      EXIT;
    END IF;
  END LOOP;
  RETURN;
END split;
3. 使用场景 我们经常使用in进行查询如
SELECT t.*
  FROM stu t
 WHERE t.useId IN ('12,23,34');
但是当查询的条数大于1000条时候就会报错。所以此时我们可以用上面的split进行查询
SELECT t.*
  FROM stu t,
       (SELECT column_value cv
          FROM TABLE(CAST(split('12,23,45,66') AS type_split))) a
 WHERE t.userId = a.cv
这其中,首先是将字符串'12,23,45,66'分割成四行,split('12,23,45,66')
然后,是把分割的值转换成 我们定义的分割类型type_split ;
cast(split('12,23,45,66')  as  type_split ) 这步貌似可以不用 然后,在table 下,转换成表。分割的字段名默认叫 column_value ;
posted @ 2013-02-04 09:41  罗曼松松  Views(462)  Comments(0)    收藏  举报