Declare
varC clob;
vRStr varchar2(1000);
ln number(4);
Strt number(4);
sStrt number(4);
differ1 number(4);
differ2 number(4);
vWStr varchar2(1000);
Begin
select DESCRLONG
into varC
from PSMSGCATDEFN
where MESSAGE_SET_NBR = 3000
AND MESSAGE_NBR = '473'
FOR UPDATE;
ln := DBMS_LOB.GetLength(varC);
Strt := 1;
vWStr := REPLACE(REPLACE(varC, '受抚养人/受益人', '家庭成员'),
'受抚养人',
'家庭成员');
sStrt := DBMS_LOB.GetLength(vWStr);
DBMS_output.put_line('未改之前varC: ' || varC);
DBMS_output.put_line('replace 的vWStr : ' || vWStr);
/*===================================
当源数据的长度与目标数据的长度相等,
则直接 Write过去(覆盖掉目标数据)。
===================================*/
if ln=sStrt then
DBMS_output.put_line('ln=sStrt ');
DBMS_LOB.Write(varC, ln,1,vWStr);
end if;
/*====================================
当源数据的长度”小于“目标数据的长度,
则先 Write源数据过去(先覆盖掉目标数
据的一部分(覆盖长度=源数据长度)),
然后,将目标数据长于源数据的部分
Erase(删除)掉。
=====================================*/
if ln>sStrt then
DBMS_output.put_line('ln>sStrt ');
differ1:=ln-sStrt;
differ2:=sStrt+1;
DBMS_LOB.Write(varC, sStrt,1,vWStr);
DBMS_LOB.Erase(varC, differ1, differ2);
end if;
/*=====================================
当源数据的长度“大于”目标数据的长度,
则取源数据一部分数据,先 Write过去(取
的规则:从源数据起始位置开始,到与目标
数据长度相等的位置为止),然后,将源数
据余下的部分 Append到目标数据后面。
======================================*/
if ln
DBMS_output.put_line('ln
differ1:=sStrt-ln;
differ2:=ln+1;
DBMS_LOB.Write(varC, ln,1,DBMS_LOB.SubStr(vWStr,ln,1));
DBMS_LOB.Append(varC, DBMS_LOB.SubStr(vWStr,differ1,differ2));
end if;
DBMS_output.put_line('修改后的varC : ' || vWStr);
UPDATE PSMSGCATDEFN SET MESSAGE_TEXT=REPLACE(MESSAGE_TEXT,'受抚养人','家庭成员') where MESSAGE_SET_NBR = 3000 AND MESSAGE_NBR='473';
commit;
End;