我需要一个应用特定规则的函数来替换字符串中的单词。
有两个变量:
该函数应解析v_schema_remap_list变量以及第一个用户的名称(破折号,旧值之前) 存在于v_imp_user_list中,然后将其替换为第二个用户(破折号后为新值)。
示例:
v_imp_user_list:='乔恩 | PETER | MARK | USER_PROD '
v_schema_remap_list:=' JOHN-GEORGE , USER_PROD-USER_TEST ”
所需结果: GEORGE | PETER | MARK | USER_TEST
我有一个解决方案,我会发布,但是由于某种原因,我不喜欢它,并且会感谢您提出任何评论/评论/更好的解决方案。
答案 0 :(得分:0)
此功能可帮助我解析v_schema_remap_list。
-- extract nth occurence in a delimited string
create or replace function f_find_str (
source_string varchar2
, occurence_outer number --occurence of the old-new pair
, occurence_inner number --old/new value, enter 1 for old or 2 for new
)
return varchar2
is
v_aux varchar2(500);
v_result varchar2(100);
begin
v_aux := ltrim(regexp_substr(',' || source_string, ',[^,]*', 1, occurence_outer),',');
if occurence_inner = 1 then
v_result := substr(v_aux, 1, instr(v_aux, '-')-1);
elsif occurence_inner = 2 then
v_result := substr(v_aux, instr(v_aux, '-')+1);
end if;
return v_result;
end;
/
此匿名块显示了我的解决方案(请参阅内部的循环)。
declare
v_schema_remap_list varchar2(1000) := 'JOHN-GEORGE,USER_PROD-USER_TEST';
v_imp_user_list varchar2(1000) := 'JOHN|PETER|MARK|USER_PROD';
v_schema_remap_cnt number := nvl(regexp_count(v_schema_remap_list, '-'), 0);
begin
for i in 1..v_schema_remap_cnt
loop
v_imp_user_list := replace(
v_imp_user_list||'|',
f_find_str (
source_string => v_schema_remap_list
, occurence_outer => i
, occurence_inner => 1
)||'|',
f_find_str (
source_string => v_schema_remap_list
, occurence_outer => i
, occurence_inner => 2
)||'|'
);
v_imp_user_list := rtrim(v_imp_user_list, '|');
end loop;
dbms_output.put_line(v_imp_user_list); --test output
end;
/