dbms_lob用法小结

来源:互联网 发布:淘宝详情页美工 编辑:程序博客网 时间:2024/06/04 19:09
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 nocopyblob,
   src_lob in blob);

dbms_lob.append(
   dest_lob in out nocopy clobcharacter set any_cs,
   src_lob in clob character setdest_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 setany_cs,
  amount in binary_integer,
  offset in integer,
  buffer in varchar2 character setlob_loc%charset);

其中各个参数的含义如下:
lob_loc是要操作的大型对象定位器。
amount是要写道大型对象中去的字节数量。
offset是指定将数据写入到大型对象什么位置的偏移地址。
buffer是写入到大型对象的数据缓冲区。
any_cs指定要使用的字符集。

示例:
declare
   source_lob clob;
   dest_lob clob;
   write_amountinteger:=18;
   writing_positioninteger;
   buffer varchar2(20) := 'Addedtext to clob';
begin
   select clob_locator intodest_lob from mylobs where lob_index = 4 for update;
   select clob_locator intosource_lob from mylobs where lob_index = 1;
   dbms_lob.append(dest_lob,source_lob);
   commit;
 
   select clob_locator intodest_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 * frommylobs;

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