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

oracle split

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秒

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

相关文章:

  • 2021-08-15
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-11
  • 2021-11-04
  • 2021-12-27
  • 2022-02-02
猜你喜欢
  • 2022-12-23
  • 2021-08-02
  • 2021-11-22
  • 2022-12-23
  • 2021-11-23
  • 2021-07-13
相关资源
相似解决方案