oracle ——lob对象 /bfile 字段

LOB  对象(Large Objecty)oracle数据库的一个大对象数据类型,可以存储超过4000bytes的字符串,二进制数据,OS文件等大对象信息.最大可存储的容量根oracle的版本和oracle 块大小有关.

具体类型:

Internal LOBs:LOB数据存储在oracle的tablespace中。

  • CLOB,NCLOB:为大字符串类型,NLOB为多语言集字符类型,类似于NVARCHAR类型,用他们代替以前的LONG类型;
  • BLOG:BLOG为大二进制类型,用来代替以前的LONG RAW类型。

 

External LOBs:LOB数据存储在数据库外部的操作系统文件中。

  • BFIEL是唯一的External LOBs.提供了在SQL中访问外部文件的方法,BFILE可存储操作系统中的各种文件。

 

bfile字段特点:

  •  BFILE 的数据是存储在操作系统文件中,而不是在数据库中,字段中存储的是文件定位指针;
  • BFILE 数据不参与事务处理,也就是说,BFILE 数据的改变不能被提交和回滚(但 BFILE 指针的改变是可以提交或回滚的);
  • 从 PL/SQL 中,只能读取 BFILE 数据,而不能写入。必须得在数据库外先创建 BFILE 文件,再创建 BFILE 指针。
1. 创建
BFILE 指针由目录和文件名组成,将这两部分信息作为参数传入 BFILENAME 函数,该函数会返回一个 BFILE 指针。

1 create or replace directory BILL_DIR_1_20130101 as 'D:\话单\mgw1\20130101';  /*创建目录*/
2 
3  bill_file varchar2(100);   
4  bill_fileloc  bfile;   //定义bfile指针
5  bill_file:='C2557.dat'
6
7 bill_fileloc:=bfilename('BILL_DIR_1_20130101',bill_file); //获得指向文件的映射,而不是文件本身

一个 BFILE 指针只是简单地将目录和文件名联合在一块,而实际的目录和文件甚至可以不存在。所以,你可以创建一个目录,它实际指向的路径并不存在;再使用这个目录创建一个 BFILE 指针。很多时候,这种功能使得我们编程很方便。

2. 读取

通过使用dbms_lob包进行对bfile读入到blob/clob对象的操作(只读)。

dest_lob blob;

/* 如果bfile文件实际存在*/

if (dbms_lob.fileexists(bill_fileloc)!=0)

then

/* 打开bfile源文件*/

dbms_lob.open(bill_fileloc,dbms_lob.readonly);

/* 打开目标blob*/

dbms_lob.open(dest_loc,dbms_lob.readwrite);

/* 从文件中装入*/

/*dbms_lob.getlength获得文件的大小*/

dbms_lob.loadfrombile(dest_lob,bill_fileloc,dbms_lob.getlength(bill_fileloc));

/* 记得关闭*/

dbms_lob.close(dest_lob);

dbms_lob.close(bill_fileloc);

end

 

读取大对象数据的过程和函数
   ①:DBMS_LOB.Read():从LOB数据中读取指定长度数据到缓冲区的过程。
      DBMS_LOB.Read(LOB数据,指定长度,起始位置,存储返回LOB类型值变量);
②:DBMS_LOB.SubStr():从LOB数据中提取子字符串的函数。
    DBMS_LOB.SubStr(LOB数据,指定提取长度,提取起始位置):

   ③:DBMS_LOB.InStr():从LOB数据中查找子字符串位置的函数。
     DBMS_LOB.InStr(LOB数据, 子字符串);
 ④:DBMS_LOB.GetLength():返回指定LOB数据的长度的函数。
     DBMS_LOB.GetLength(LOB数据);
⑤:DBMS_LOB.Compare():比较二个大对象是否相等。返回数值0为相等,-1为不相等。
     DBMS_LOB.Compare(LOB数据,LOB数据);
操作大对象数据的过程
    操作会改变数据库中原有数据,需要加上Updata锁锁上指定数据列,修改完后提交事务。
     ①:DBMS_LOB.Write():将指定数量的数据写入LOB的过程。
     DBMS_LOB.Write(被写入LOB, 写入长度(指写入LOB数据),写入起始位置(指被写入LOB),写入LOB数据);
   ②:DBMS_LOB.Append():将指定的LOB数据追加到指定的LOB数据后的过程。
     DBMS_LOB.Append(LOB数据,LOB数据);
 ③:DBMS_LOB.Erase():删除LOB数据中指定位置的部分数据的过程;
     DBMS_LOB.Erase(LOB数据,指定删除长度, 开始删除位置);
  ④:DBMS_LOB.Trim():截断LOB数据中从第一位置开始指定长度的部分数据的过程;
     DBMS_LOB.Trim(LOB数据,截断长度);
  ⑤:DBMS_LOB.Copy():从指定位置开始将源LOB复制到目标LOB;
     DBMS_LOB.Copy(源LOB,目标LOB,复制源LOB长度,复制到目标LOB开始位置,复制源LOB开始位置)

 

posted @ 2013-01-17 11:43  lucyawei  阅读(690)  评论(0编辑  收藏  举报