现在的位置: 首页 > 综合 > 正文

dbms_lob中substr,append,write用法

2014年09月18日 ⁄ 综合 ⁄ 共 2681字 ⁄ 字号 评论关闭

本文转自:http://blog.sina.com.cn/s/blog_713978a50100prkt.html

注:在原文基础上作部分改动。


一、dbms_lob.substr()方法

CLOB里存的是2进制
判定长度   DBMS_LOB.GETLENGTH(col1)
获取文本   DBMS_LOB.SUBSTR(col1,n,pos)
DBMS_LOB.SUBSTR(col1,10,1)表示从第1个字节开始取出10个字节
DBMS_LOB.SUBSTR(CLOB_VAR,32767)表示截取CLOB变量保存的全部数据
DBMS_LOB.FILECLOSE(IMG_BFILE)关闭文件

代码示例:

-- 建表
create table bak_DBMS_LOB_0302(
  bak_id number(4),
  bak_comment clob
);
commit;

-- 插入测试数据
delete from bak_dbms_lob_0302;
insert into bak_dbms_lob_0302(bak_id,bak_comment) values(1,'a');
insert into bak_dbms_lob_0302(bak_id,bak_comment) values(2,'ab');
insert into bak_dbms_lob_0302(bak_id,bak_comment) values(3,'abcdefgccccccc');
insert into bak_dbms_lob_0302(bak_id,bak_comment) values(4,'a   bcdefg');
commit;

-- 获取字段长度
select dbms_lob.getlength(bak_comment) from bak_dbms_lob_0302;
-- 获取字段全部数据
select dbms_lob.substr(bak_comment,32767) from bak_dbms_lob_0302;
-- 从第1个字节开始取出5个字节,查询出的bak_comment字段乱码
select b.bak_id, utl_raw.cast_to_varchar2(dbms_lob.substr(bak_comment,5,1)) 
  from bak_dbms_lob_0302 b;
-- 从第1个字节开始取出5个字节,正常显示,即使clob中包含空格仍能正常显示
select b.bak_id, dbms_lob.substr(bak_comment,5,1) from bak_dbms_lob_0302 b for update;

二、dbms_lob.append()和dbms_lob.write()方法

dbms_lob.append 和 dbms_lob.write
append存储过程用于将一个大对象添加到另一个大对象中,此时是将源对象的内容全部添加过去。append存储过程的语法如下:
dbms_lob.append(
   dest_lob in out nocopy blob,
   src_lob in  blob);
dbms_lob.append(
   dest_lob in out nocopy clob character set any_cs,
   src_lob in clob character set dest_lob%charset);
其中,各个参数的含义如下:
dest_lob是被源lob添加到的目标lob的定位器
src_lob是源lob的定位器
any_cs用来指定字符集。
write存储过程
write存储过程能够将数据写入大型对象中。写的位置是从大型对象开始处的某个绝对偏移地址,数据从缓冲区参数被写入。写操作将覆盖已经在大型对象偏移地址处存在的任何长度为指定的数据。如果输入数多于在缓冲区的数据,将产生一个错误。如果输入数量小于在缓冲区的数据,那么只有缓冲区的数据字节活字符被写给大型对象。
write存储过程的语法如下:
dbms_lob.write(
  lob_loc in out nocopy blob,
  amount in binary_integer,
  offset in integer,
  buffer in raw);
dbms_lob.write(
  lob_loc in out nocopy clob character set any_cs,
  amount in binary_integer,
  offset in integer,
  buffer in varchar2 character set lob_loc%charset);
其中各个参数的含义如下:
lob_loc是要操作的大型对象定位器。
amount是要写道大型对象中去的字节数量。
offset是指定将数据写入到大型对象什么位置的偏移地址。
buffer是写入到大型对象的数据缓冲区。
any_cs指定要使用的字符集。

代码示例:

declare
  src_lob clob;
  dest_lob clob;
  write_amount integer:= 18;
  writing_position integer;
  buffer_text varchar2(20) := 'added text to clob';
begin
  select bak_comment into dest_lob from bak_dbms_lob_0302 where bak_id = 1 for update;
  select bak_comment into src_lob from bak_dbms_lob_0302 where bak_id = 2;
  -- 字符串合并后自动更新到数据表中
  dbms_lob.append(dest_lob,src_lob);
  dbms_output.put_line(src_lob);
  dbms_output.put_line(dest_lob);
  commit;
   
  select bak_comment into dest_lob from bak_dbms_lob_0302 
    where bak_id = 2 for update;
  writing_position := dbms_lob.getlength(dest_lob) + 1;
  -- 将指定长度的字符串添加到字段末尾,并更新到数据表中
  dbms_lob.write(dest_lob,write_amount,writing_position,buffer_text);
  dbms_output.put_line(dest_lob);
  dbms_output.put_line(write_amount);
  dbms_output.put_line(writing_position);
  commit;

end;
/

抱歉!评论已关闭.