動態PL/SQL,對CLOB字段操作可傳遞表名table_name,表的唯一標志字段名field_id,clob字段名field_name,記錄號v_id,開始處理字符的位置v_pos,傳入的字符串變量v_clob 修改CLOB的PL/SQL過程:updateclob createorreplaceprocedure updateclob( table_name invarchar2, field_id invarchar2, field_name invarchar2, v_id innumber, v_pos innumber, v_clob invarchar2) 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 createorreplacefunction getclob( table_name invarchar2, field_id invarchar2, field_name invarchar2, v_id innumber, v_pos innumber) returnvarchar2 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)長度的目標字符串。 調用PL/SQL過程的方法: SQL*PLUS SQL>EXEC 過程名[(參數)]; Procedure Builder PL/SQL>過程名[(參數)]; JAVA CALL { 過程名[(參數)] }; PHP BEGIN { 過程名[(參數)] } END;