Sie haben Ihren rec nicht beschrieben type, also zeige ich ein Beispiel, wie man es unabhängiger macht:
declare
type t_rec is record(
param1 varchar2(30),
param2 varchar2(30),
param3 varchar2(30),
param4 varchar2(30),
param5 varchar2(30)
);
rec t_rec;
v_tx_cuerpo varchar2(4000);
function f_subst(str varchar2, template varchar2, subst ora_name_list_t) return varchar2
as
res varchar2(32767):=str;
begin
for i in 1..subst.count loop
res:=replace(res, replace(template,'%d',i), subst(i));
end loop;
return res;
end;
begin
v_tx_cuerpo:='p1:${param1};p2:${param2};p3:${param3};p4:${param4};p5:${param5};';
v_tx_cuerpo:=f_subst(
v_tx_cuerpo,
'${param%d}',
ora_name_list_t('str1','str2','str3','str4','str5')
);
dbms_output.put_line(v_tx_cuerpo);
end;
/
wie Sie sehen können, habe ich function f_subst erstellt das braucht 3 Argumente:
str varchar2- Eingabestring zum Ersetzentemplate varchar2- Zeichenfolgenmaske zum Ersetzen, in Ihrem Beispiel ist es${param%d}subst ora_name_list_t- das ist ein Sammlung definiert alsTYPE ora_name_list_t IS TABLE OF VARCHAR2(2*(ORA_MAX_NAME_LEN+2)+1), sodass Sie eine beliebige Anzahl von Zeichenfolgen zum Ersetzen angeben können. In diesem Beispiel habe ichstr1eingefügt zustr5.
Diese Funktion iteriert also Eingabesammlungselemente und ersetzt alle Teilstrings, die mit einer Eingabevorlagenmaske übereinstimmen, durch den Wert aus dieser Sammlung.
Ergebnisse:
p1:str1;p2:str2;p3:str3;p4:str4;p5:str5;
Und schließlich verwenden Sie Ihren ursprünglichen rec :
declare
type t_rec is record(
param1 varchar2(30),
param2 varchar2(30),
param3 varchar2(30),
param4 varchar2(30),
param5 varchar2(30)
);
rec t_rec;
v_tx_cuerpo varchar2(4000);
function f_subst(str varchar2, template varchar2, subst ora_name_list_t) return varchar2
as
res varchar2(32767):=str;
begin
for i in 1..subst.count loop
res:=replace(res, replace(template,'%d',i), subst(i));
end loop;
return res;
end;
begin
v_tx_cuerpo:='p1:${param1};p2:${param2};p3:${param3};p4:${param4};p5:${param5};';
rec.param1:='str1';
rec.param2:='str2';
rec.param3:='str3';
rec.param4:='str4';
rec.param5:='str5';
v_tx_cuerpo:=f_subst(
v_tx_cuerpo,
'${param%d}',
ora_name_list_t(
rec.param1,
rec.param2,
rec.param3,
rec.param4,
rec.param5
)
);
dbms_output.put_line(v_tx_cuerpo);
end;
/