加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

dbms_lob用法小结

(2011-03-30 09:25:26)
标签:

杂谈

分类: oracle学习笔记

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)关闭文件

 

clob转化为字符串,SELECT   UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(col1,10,1))   FROM   tab1;

如果clob中包含空格则不能使用。

将clob类型转化成字符串

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   ';
      EXECUTE   IMMEDIATE   query_str   INTO   lobloc   USING   v_id;
      offset:=offset+(v_pos-1)*2000;
      dbms_lob.read(lobloc,amount,offset,buffer);
               return   buffer;
exception
        when   no_data_found   then
               return   buffer;
end;

 

两个写数据的存储过程

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
   source_lob clob;
   dest_lob clob;
   write_amount integer:=18;
   writing_position integer;
   buffer varchar2(20) := 'Added text to clob';
begin
   select clob_locator into dest_lob from mylobs where lob_index = 4 for update;
   select clob_locator into source_lob from mylobs where lob_index = 1;
   dbms_lob.append(dest_lob, source_lob);
   commit;
  
   select clob_locator into dest_lob from mylobs where lob_index = 5 for update;
   writing_position := dbms_lob.getlength(dest_lob) + 1;
   dbms_lob.write(dest_lob, write_amount, writing_position, buffer);
   commit;
end;
/

SQL> select * from mylobs;

 LOB_INDEX---CLOB_LOCATOR-------------------------------------------------------
          I Love Oracle 9i
          Oracle 9i is powerful
          Oracle 9i is the most popular database in the world
          I Love Oracle 9iI Love Oracle 9i
          Oracle 9i is powerfulAdded text to clob

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有