ORACLE LOB大对象处理

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<sStrt then
  DBMS_output.put_line('ln<sStrt  ');
 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;

你可能感兴趣的:(oracle,sql)