Oracle 创建 split 和 splitstr 函数

Sql语句最好依次执行创建

/**************************************
 * name:        split
 * author:      sean zhang.
 * date:        2012-09-03.
 * function:    返回字符串被指定字符分割后的表类型。
 * parameters:  p_list: 待分割的字符串。
                p_sep: 分隔符,默认逗号,也可以指定字符或字符串。
 * example:     select * from users where u_id in (select column_value from table (split ('1,2')))
                返回u_id为1和2的两行数据。
 **************************************/
/* 创建一个表类型 */
create or replace type tabletype as table of varchar2(32676)

/* 创建 split 函数 */
create or replace function split (p_list clob, p_sep varchar2 := ',')
   return tabletype
   pipelined

is
   l_idx    pls_integer;
   v_list   varchar2 (32676) := p_list;
begin
   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;
end;

/**************************************
 * name:        splitstr
 * author:      sean zhang.
 * date:        2012-09-03.
 * function:    返回字符串被指定字符分割后的指定节点字符串。
 * parameters:  str: 待分割的字符串。
                i: 返回第几个节点。当i为0返回str中的所有字符,当i 超过可被分割的个数时返回空。
                sep: 分隔符,默认逗号,也可以指定字符或字符串。当指定的分隔符不存在于str中时返回sep中的字符。
 * example:     select splitstr('abc,def', 1) as str from dual;  得到 abc
                select splitstr('abc,def', 3) as str from dual;  得到 空
 **************************************/
/* 创建 splitstr 函数 */
create or replace function splitstr(str in clob,
                                    i   in number := 0,
                                    sep in varchar2 := ',') return varchar2 is
  t_i     number;
  t_count number;
  t_str   varchar2(4000);
begin
  if i = 0 then
    t_str := str;
  elsif instr(str, sep) = 0 then
    t_str := sep;
  else
    select count(*) into t_count from table(split(str, sep));

    if i <= t_count then
      select str
        into t_str
        from (select rownum as item, column_value as str
                from table(split(str, sep)))
       where item = i;
    end if;
  end if;

  return t_str;
end;

示例:split(字符串,标识)

select  split(‘a,b,c,e,d,f,g‘)  arrData  from  dual;

默认使用逗号分割,可以自定义修改,如:select split(‘X-rapido & Lemon‘,‘&‘) arrData from dual;

点开集合

默认使用逗号分割,可以自定义修改,如:select split(‘X-rapido & Lemon‘,‘&‘) arrData from dual;

示例:splitstr(字符串,获取的节点下标,分隔符)

select splitstr(‘X-rapido&Lemon&Jennifer‘, 1, ‘&‘) word from dual;  -- X-rapido

select splitstr(‘X-rapido&Lemon&Jennifer‘, 2, ‘&‘) word from dual;  -- Lemon

select splitstr(‘X-rapido&Lemon&Jennifer‘, 3, ‘&‘) word from dual;  -- Jennifer

select splitstr(‘X-rapido&Lemon&Jennifer‘, 4, ‘&‘) word from dual;
 -- 空字符串

http://www.cnblogs.com/enjoycode/archive/2012/11/10/oracle_split.html

时间: 2024-10-15 18:34:48

Oracle 创建 split 和 splitstr 函数的相关文章

Oracle使用split和splitstr函数批量分隔字符串

1.创建一个表类型 tabletype: create or replace type tabletype as table of VARCHAR2(32676); 2.创建split  函数 CREATE OR REPLACE FUNCTION split (p_list CLOB, p_sep VARCHAR2 := ',') RETURN tabletype PIPELINED IS /* * 2015-11-11 * Function: 返回字符串被指定字符分割后的表类型. * Para

Oracle 11g 的PL/SQL函数结果缓存

模仿Oracle性能诊断艺术中的例子做了两个试验,书上说如果不用RELIES_ON,则函数依赖的对象发生的变更操作就不会导致结果缓存的失效操作(result_cache RELIES_ON(test1,test2)),试验证明不对,函数f1()并没有使用RELIES_ON,但表上的变化影响到了函数. C:\Documents and Settings\guogang>sqlplus gg_test/[email protected]_gg SQL*Plus: Release 10.2.0.1.0

创建sql自定义的函数及商品分页sql存储过程

--商品筛选时判断品牌ID是否存在 --select dbo.isValite(94,94)create function isValite(@brandId int,@bId int)returns intas begin Declare @rNumber int if @brandId = @bId set @rNumber = 1 else set @rNumber = 0 if @bId = 0 set @rNumber = 1 return @rNumberendgo --判断商品筛选

oracle常用数据库内置函数

函数 返回值 样例 显示 CEIL(n) 大于或等于数值n的最小整数 SELECT CEIL(10.6) FROM TABLE_NAME; 11 FLOOR(n) 小于等于数值n的最大整数 SELECT FLOOR (10.6) FROM TABLE_NAME; 10 MOD(m,n) m除以n的余数,若n=0,则返回m SELECT MOD (7,5) FROM TABLE_NAME l; 2 POWER(m,n) m的n次方 SELECT POWER (3,2) FROM TABLE_NAM

Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)

PL/SQL子程序 包括函数和过程.这里的函数指的是用户自己定义的函数,和系统函数是不同的.子程序一般是完成特定功能的PL/SQL程序块,并且具有一定的通用性,可以被不同的应用程序多次调用.Oracle提供可以把PL/SQL程序存储在数据库中,并可以再任何地方来运行它.这样就叫做存储过程或者是函数.过程和函数的唯一区别就是函数总是向调用者返回数据,而过程则不返回数据. 函数 如果用户要经常执行某些操作,并且需要返回特定的数据,那么就可以将这些操作构造成一个函数. 可以使用SQL语句定义函数. 基

Oracle创建存储过程

  1.基本语法 create or replace procedure update_emp_sal (Name in out type, Name in out type, ... ) is begin end update_emp_sal; 2.写一个简单的例子修改emp表的ename字段 create or replace procedure update_emp ( v_empno varchar2, v_ename varchar2 ) is begin update emp set

Oracle创建表语句(Create table)语法详解及示例

Oracle创建表语句(Create table)语法详解及示例   创建表(Create table)语法详解1. ORACLE常用的字段类型ORACLE常用的字段类型有VARCHAR2 (size) 可变长度的字符串, 必须规定长度CHAR(size) 固定长度的字符串, 不规定长度默认值为1NUMBER(p,s) 数字型p是位数总长度, s是小数的长度, 可存负数最长38位. 不够位时会四舍五入.DATE 日期和时间类型LOB 超长字符, 最大可达4GCLOB 超长文本字符串BLOB 超长

Oracle创建表空间和表

创建表空间和表ORACLE物理上是由磁盘上的以下几种文件:数据文件和控制文件和LOGFILE构成的oracle中的表就是一张存储数据的表.表空间是逻辑上的划分.方便管理的.数据表空间 (Tablespace)         存放数据总是需要空间, Oracle把一个数据库按功能划分若干空间来保存数据.当然数据存放在磁盘最终是以文件形式,所以一盘一个数据表空间包含一个以上的物理文件数据表         在仓库,我们可能有多间房子,每个房子又有多个货架,每架又有多层. 我们在数据库中存放数据,最

Oracle 创建索引的基本规则总结

Oracle 创建索引的基本规则总结 一.B-Tree索引 1.  选择索引字段的原则: 在WHERE子句中最频繁使用的字段 联接语句中的联接字段 选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很好) Oracle在UNIQUE和主键字段上自动建立索引 在选择性很差的字段上建索引只有在这个字段的值分布非常倾斜的情况下才有益(在这种情况下,某一,两个字段值比其它字段值少出现很多) 不要在很少独特值的字段上建B-TREE索引,在这种情况下,你可以考虑在这些字段上建位图索引.在