Bạn chưa mô tả rec
của mình nhập, vì vậy tôi sẽ đưa ra một ví dụ về cách làm cho nó độc lập hơn:
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;
/
như bạn có thể thấy, tôi đã tạo function f_subst
cần 3 đối số:
-
str varchar2
- chuỗi đầu vào để thay thế -
template varchar2
- mặt nạ chuỗi để thay thế, trong ví dụ của bạn là${param%d}
-
subst ora_name_list_t
- đó là bộ sưu tập được định nghĩa làTYPE ora_name_list_t IS TABLE OF VARCHAR2(2*(ORA_MAX_NAME_LEN+2)+1)
, vì vậy bạn có thể chỉ định bất kỳ số lượng chuỗi nào để thay thế. Trong ví dụ này, tôi đã đặtstr1
thànhstr5
.
Vì vậy, hàm này lặp lại các phần tử của bộ sưu tập đầu vào và thay thế bất kỳ chuỗi con nào khớp với mặt nạ mẫu đầu vào với giá trị từ bộ sưu tập này.
Kết quả:
p1:str1;p2:str2;p3:str3;p4:str4;p5:str5;
Và cuối cùng sử dụng rec
ban đầu của bạn :
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;
/