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开始位置)