在oracle中分裂字符串 - 最快的方式

时间:2014-10-15 14:42:26

标签: sql oracle plsql triggers split

有人知道如何拆分用';'分隔的字符串在触发器中,比这段代码更快:

SELECT regexp_substr('asd;asaaaad;dd;', '([^;]*)(;)', 1, level, null, 1) 
  BULK COLLECT INTO array_TREATMENT_TR_CD 
FROM DUAL 
CONNECT BY LEVEL < REGEXP_COUNT('asd;asaaaad;dd;', '[;]') + 1 ;

1 个答案:

答案 0 :(得分:0)

Regexp函数通常比标准db函数慢。当我运行你的代码100.000次大约需要12秒(在我的数据库,YMMV上)。

然后我创建了这个小测试:

declare
  type t_vc2 is table of varchar2(250) index by pls_integer;

  procedure split_str(
    p_str1      in out nocopy varchar2
  , p_str2      out           varchar2
  , p_separator in            varchar2 default ';'
  )
  is
    l_pos pls_integer;
  begin
    l_pos := instr(p_str1, p_separator);
    if nvl(l_pos, 0) = 0
    then
      p_str2 := p_str1;
      p_str1 := null;
    else
      p_str2 := substr(p_str1, 1, l_pos-1);
      p_str1 := substr(p_str1, l_pos+1);
    end if;
  end split_str;
begin
  for l_i in 1 .. 1000000
  loop
    declare
      array_TREATMENT_TR_CD    t_vc2;
      l_input varchar2(250);
      l_return varchar2(250);
    begin
      l_input := 'asd;asaaaad;dd;';
      loop
        split_str(l_input, l_return);
        if l_return is not null
        then
          array_TREATMENT_TR_CD(array_TREATMENT_TR_CD.count+1) := l_return;
        end if;
        exit when l_return is null;
      end loop;
    end;
  end loop;
end;
/

将您的示例字符串解析为具有标准数据库函数的数组100.000次。大约需要0.5秒。如果“实时”是您的目标,那将是一项重大改进。