有人知道如何拆分用';'分隔的字符串在触发器中,比这段代码更快:
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 ;
答案 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秒。如果“实时”是您的目标,那将是一项重大改进。