zoukankan      html  css  js  c++  java
  • oracle split

    select * from table(fun_strsplit('1,2,3,4,5'));

    1、创建一个类型

    CREATE OR REPLACE TYPE Strsplit_Type IS TABLE OF VARCHAR2(4000)

    2、创建函数

    CREATE OR REPLACE FUNCTION Fun_Strsplit(p_Value VARCHAR2,
                                            p_Split VARCHAR2 := ',')
    --usage: select * from table(fun_strsplit('1,2,3,4,5'))
     RETURN Strsplit_Type
      PIPELINED IS
      v_Idx       INTEGER;
      v_Str       VARCHAR2(500);
      v_Strs_Last VARCHAR2(4000) := p_Value;
    
    BEGIN
      LOOP
        v_Idx := Instr(v_Strs_Last, p_Split);
        EXIT WHEN v_Idx = 0;
        v_Str       := Substr(v_Strs_Last, 1, v_Idx - 1);
        v_Strs_Last := Substr(v_Strs_Last, v_Idx + 1);
        PIPE ROW(v_Str);
      END LOOP;
      PIPE ROW(v_Strs_Last);
      RETURN;
    
    END Fun_Strsplit;

     我本想把这个函数用在大批量数据处理中,后来发现写在sql中会导致性能慢很多倍,因为方法中有循环

    例:

    假如每行数据中需要用split循环8次,split(1,2,3,4,5,6,7,8)

    split前 1W行 2秒  用split后 1W行 2*8=16秒

    split前 100W行 100秒 用split后 100W行 100*8=800秒 比之前多了700秒

    我这里的比喻不一定准确,我只是认为大数据量千万别用循环嵌套在里面,数据量越大损耗越多。

  • 相关阅读:
    如何书写bat文件?(转)
    Bogon
    recursive
    ssh
    verbose
    mii-tool
    ExtJs 中的ext.date
    一个打包机~~~
    图标库--宝藏
    几种常用的控件(下拉框 可选框 起止日期 在HTML页面直接读取当前时间)
  • 原文地址:https://www.cnblogs.com/chenv/p/5424117.html
Copyright © 2011-2022 走看看