1、BFILE类型介绍
- BFILE类型是Oracle数据库中LOB类型的一种
- BFILE字段存放指向操作系统文件的指针
- BFILE字段只支持只读访问
- BFILE字段支持最大2^64-1 bytes文件
- BFILE字段指向的文件不是数据库的一部份,只能在数据库外维护
- 对BFILE字段操作要使用BFILENAME函数
- 读取BFILE字段需要使用DBMS_LOB包
2、BFILENAME函数介绍
- BFILENAME函数语法如下
- BFILENAME函数有两个参数 '
directory
','filename
' - '
directory
'参数是大小写敏感的 - '
directory
'参数所指定的目录必须在dba_directories中存在
3、创建包含BFILE字段的表
3.1、新建目录/tmp/bfile
[oracle@centos651 ~]$ mkdir -p /tmp/bfile/
3.2、创建directory
SQL> create directory BFILEDIR as '/tmp/bfile';
注:关于创建目录的详细方法和目录的权限这里不做介绍,请自行搜索。
3.3、新建两个文件
[oracle@centos651 bfile]$ pwd
/tmp/bfile
[oracle@centos651 bfile]$ cat bfile1.txt
abcd1234
efgh5678
[oracle@centos651 bfile]$ cat bfile2.txt
this is a bfile test file!
3.4、创建表
SQL> create table falt_bfile ( id number, bfile_name bfile) ;
Table created.
3.5、初始化表数据
SQL> insert into falt_bfile values (1, BFILENAME('BFILEDIR', 'bfile1.txt'));
1 row created.
SQL> insert into falt_bfile values (2, BFILENAME('BFILEDIR', 'bfile2.txt'));
1 row created.
SQL> commit;
Commit complete.
注:Oracle并不会检查目录和文件是否存在,因此需要用户去保证目录和文件名有效。
4、读取BFILE列的内容
要使用dbms_lob包读取BFILE列的内容
SQL> set serveroutput on;
SQL> declare
2 buff raw(2000);
3 amount int;
4 offset int := 1;
5 lob_loc bfile;
6 begin
7 select bfile_name into lob_loc from falt_bfile where id=1;
8 dbms_lob.fileopen(lob_loc, 0); --打开BFILE文件
9 amount := dbms_lob.getlength(lob_loc); --获取文件大小
10 dbms_lob.read(lob_loc, amount, offset, buff); --读取文件内容
11 dbms_lob.fileclose(lob_loc); --关闭BFILE文件
12 dbms_output.put_line(buff); --打印RAW
13 dbms_output.put_line(utl_raw.cast_to_varchar2(buff)); --转换RAW为CHAR,并打印
14 end;
15 /
61626364313233340A65666768353637380A
abcd1234
efgh5678
PL/SQL procedure successfully completed.
SQL>
5、BFILE字段更新
SQL> select * from falt_bfile where id=2;
ID BFILE_NAME
---------- ----------------------------------------
2 bfilename('BFILEDIR', 'bfile2.txt')
SQL> update falt_bfile set bfile_name=BFILENAME('BFILEDIR', 'bfile3.txt') where id=2;
1 row updated.
SQL> select * from falt_bfile where id=2;
ID BFILE_NAME
---------- ----------------------------------------
2 bfilename('BFILEDIR', 'bfile3.txt')
SQL> commit;
Commit complete.