用varray plsql中的字符串替换特殊字符串

时间:2015-08-03 22:07:50

标签: plsql

我有这些变量:

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中执行此操作?

感谢您的回答。

3 个答案:

答案 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);