• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    给Oracle添加split和splitstr函数的方法
    最近项目中有很多需要做批量操作的需求,客户端把一组逗号分隔的ID字符串传给数据库,存储过程就需要把它们分割,然后逐个处理。
    以往的处理方式有如下几种:

    1、在存储过程内写循环,逐个分析字符串中的ID,然后逐个处理。缺点:循环一次处理一个,如果每次判断都很多,效率将很受影响。适合每次处理要做单独判断的情况。

    2、使用临时表,先调用一个存储过程将ID拆分并插入到临时表中,然后结合临时表可以写SQL一次处理多笔。缺点:需要插临时表,效率不高,数据量越大影响越严重。

    以前的项目用的最多的还是第2中方式,毕竟方便,且效率比第1种好。
    现在项目中用到了很多很多的批量操作,很多的重复代码让我不厌其烦。忽然想到,.Net和JS中都有split类似的函数,拆分字符串很方便,oracle中要是也有这样的功能该多好呀。

    多方查找资料发现,给oracle添加split函数是完全可以实现的,避免了插入临时表,所以效率比上面的第2中方法效率高很多。

    后来我还添加了splitstr函数,可以很方便获取字符串中的指定节点。
    有了这两个函数,处理批量操作,真是如虎添翼,效率倍增,嘿嘿……
    好了,闲话少说,上代码!如有不妥之处,请各位前辈博友斧正。
    复制代码 代码如下:

    /*
    * Oracle 创建 split 和 splitstr 函数
    */
    /* 创建一个表类型 */
    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
    /**************************************
    * 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的两行数据。
    **************************************/
    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;
    /
    /* 创建 splitstr 函数 */
    CREATE OR REPLACE FUNCTION splitstr (str IN CLOB,
    i IN NUMBER := 0,
    sep IN VARCHAR2 := ','
    )
    RETURN VARCHAR2
    /**************************************
    * 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; 得到 空
    **************************************/
    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;
    /
    您可能感兴趣的文章:
    • Oracle 11g Client客户端安装教程
    • Oracle中转义字符的详细介绍
    • Oracle minus用法详解及应用实例
    • Oracle 中 table 函数的应用浅析
    • Oracle用户密码设为不过期的两种方法
    • Oracle 删除用户和表空间详细介绍
    • 使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
    • oracle 11g配置 解决启动连接数据库出现的ora错误
    • 完美卸载Oracle数据库
    • Oracle 自定义split 函数实例详解
    上一篇:bitmap 索引和 B-tree 索引在使用中如何选择
    下一篇:oracle怎么删除用户提供解决方案
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    给Oracle添加split和splitstr函数的方法 给,Oracle,添加,split,和,splitstr,