動態PL/SQL,對CLOB字段操作可傳遞表名table_name,表的唯一標志字段名field_id,clob字段名field_name,記錄號v_id,開始處理字符的位置v_pos,傳入的字符串變量v_clob
  
  修改CLOB的PL/SQL過程:updateclob
  
                                                                                              create or replace PRocedure updateclob(
  table_name in varchar2,
  field_id in varchar2, 
  field_name in varchar2,
  v_id in number,
  v_pos in number,
  v_clob in varchar2)
  is
  lobloc clob;
  c_clob varchar2(32767);
  amt binary_integer;
  pos binary_integer;
  query_str varchar2(1000);
  begin
  pos:=v_pos*32766+1;
  amt := length(v_clob);
  c_clob:=v_clob;
  query_str :='select 'field_name' from 'table_name' where 'field_id'= :id for update ';
  --initialize buffer with data to be inserted or updated
  EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
  --from pos position, write 32766 varchar2 into lobloc
  dbms_lob.write(lobloc, amt, pos, c_clob);
  commit;
  exception
  when others then
  rollback;
  end;
  /
  
  用法說明:
  在插入或修改以前,先把其它字段插入或修改,CLOB字段設置為空empty_clob(),然后調用以上的過程插入大于2048到32766個字符。
  假如需要插入大于32767個字符,編一個循環即可解決問題。
  
  查詢CLOB的PL/SQL函數:getclob
  
  create or replace function getclob(
  table_name in varchar2,
  field_id in varchar2, 
  field_name in varchar2,
  v_id in number,
  v_pos in number) return varchar2
  is
  lobloc clob;
  buffer varchar2(32767);
  amount number := 2000;
  offset number := 1;
  query_str varchar2(1000);
  begin
  query_str :='select 'field_name' from 'table_name' where 'field_id'= :id ';
  --initialize buffer with data to be found
  EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
  offset:=offset+(v_pos-1)*2000; 
  --read 2000 varchar2 from the buffer
  dbms_lob.read(lobloc,amount,offset,buffer);
  return buffer;
  exception
  when no_data_found then
  return buffer;
  end;
  /
  
  用法說明:
  用select getclob(table_name,field_id,field_name,v_id,v_pos) as partstr from dual;
  可以從CLOB字段中取2000個字符到partstr中,編一個循環可以把partstr組合成dbms_lob.getlength(field_name)長度的目標字符串。