我有这些变量:
TYPE replacement IS VARRAY(10) OF VARCHAR2(75);
v_names Prod_Names := Prod_Names('First','Second');
l_string varchar2(100) := 'This is %s string with %s word.';
我需要用我的数组中的元素替换%s
。我的想法是,我将有一个函数返回l_string替换为varray中的元素(将作为IN参数)。
如何在PL / SQL中执行此操作?
感谢您的回答。
答案 0 :(得分:1)
以下一个相当简单且自我修改的代码应该按照您的要求进行操作。请阅读regexp_replace
参数详细信息的精细手册。像往常一样,OP的潜在错误情况(例如,值的数量与模板字符串不匹配)。
create or replace type so51_t is table of varchar2(75);
/
show errors
create or replace function so51_f(
p_values in so51_t
,p_template in varchar2
) return varchar2 is
v_ret varchar2(32767) := p_template;
begin
for i in p_values.first .. p_values.last
loop
v_ret := regexp_replace(v_ret, '%s', p_values(i), 1, 1);
end loop;
return v_ret;
end;
/
show errors
示例输出
select so51_f(so51_t('foo', 'bar', 'car'), '%s is %s is %s') from dual
union all
select so51_f(so51_t('foo', 'bar', 'car'), q'[I don't think this %s makes sense with %s and %s]') from dual
;
SO51_F(SO51_T('FOO','BAR','CAR'),'%SIS%SIS%S')
--------------------------------------------------------------------------------
foo is bar is car
I don't think this foo makes sense with bar and car
答案 1 :(得分:0)
这是你在找什么?
l_string := 'This is ' || v_names(1) ||' string with ' || v_names(2) || 'word.';
双管用于连接字符串。
答案 2 :(得分:0)
最后我找到了答案。
变量:
l_string VARCHAR2(500);
l_output_string VARCHAR2(1000);
l_temp VARCHAR2(100) DEFAULT 1;
TYPE myarray IS TABLE OF NUMBER;
TYPE t_input_params IS VARRAY(50) OF VARCHAR2(500);
i_params IN t_input_params,
l_temp_array myarray := myarray();
这是功能主体:
FOR i IN 1..(LENGTH(l_string) - LENGTH(REPLACE(l_string, '%s', ' ')))
LOOP
l_temp_array.extend;
l_temp_array(i):=INSTR(l_string,'%s',1,i);
END LOOP;
FOR i IN 1..least(l_temp_array.count,i_params.count)
LOOP
l_output_string:=l_output_string||SUBSTR(l_string,l_temp,l_temp_array(i)-l_temp)||i_params(i);
l_temp:=l_temp_array(i)+2;
END LOOP;
l_output_string:=l_output_string||SUBSTR(l_string,l_temp,length(l_string)+1-l_temp);