處理CLOB字段的動(dòng)態(tài)PL/SQL
動(dòng)態(tài)PL/SQL,對(duì)CLOB字段操作可傳遞表名table_name,表的唯一標(biāo)志字段名field_id,clob字段名field_name,記錄號(hào)v_id,開始處理字符的位置v_pos,傳入的字符串變量v_clob
修改CLOB的PL/SQL過(guò)程: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;
/
用法說(shuō)明:
在插入或修改以前,先把其它字段插入或修改,CLOB字段設(shè)置為空empty_clob(),
然后調(diào)用以上的過(guò)程插入大于2048到32766個(gè)字符。
如果需要插入大于32767個(gè)字符,編一個(gè)循環(huán)即可解決問(wèn)題。
查詢CLOB的PL/SQL函數(shù):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;
/
用法說(shuō)明:
用select getclob(table_name,field_id,field_name,v_id,v_pos) as partstr from dual;
可以從CLOB字段中取2000個(gè)字符到partstr中,
編一個(gè)循環(huán)可以把partstr組合成dbms_lob.getlength(field_name)長(zhǎng)度的目標(biāo)字符串。