http://expert.csdn.net/Expert/topic/945/945941.xml?temp=.7886927
解决方案 »
- an unsupported operation was attempted
- 这个表的索引应该怎么建?
- 请高手帮我分析下一个ORACLE 的问题,急,在线等。。。
- group by 的问题
- 50分sql题目
- 如何将字符型转换为整数型?
- 我的oem怎么连接不上呀?请教呀!
- 550万记录的表
- 急需!我要下载一些有关,惠谱型号为(HP PROLIANT ML 570)的硬件资料。还有关集群设置,双机容错(热备份)及基本配置单总过程(是用WIN
- 关于游标定义的问题?求助:(
- 一个user怎么能看到另一个user下的表
- 在存储过程中如何将一张表保存为一个磁盘文件,是用DBMS_PIPE和Pro*C来实现好呢还是用UTL_FILE包好?
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)长度的目标字符串。