兼容内置包-DBMS_LOB
功能描述
用于提供一组对blob、clob和bfile数据类型操作的函数或过程。
函数说明
GETLENGTH函数
获取LOB对象(blob、clob、bfile)的长度。
FILEOPEN函数
打开一个bfile指向的操作系统物理文件,该文件不属于数据库数据,位于数据库数据目录以外。
dbms_lob.fileopen(file_loc,open_mode);
READ函数
读取bfile指向的物理文件的全部或指定部分内容。
dbms_lob.read(file_loc,amount,offset,buffer);
FILECLOSE函数
关闭一个bfile文件。
dbms_lob.read(file_loc);
参数说明
lob_loc:blob、clob类型大文件定位器。如为NULL则返回NULL。
file_loc:bfile类型文件定位器。
amount:integer类型,读取的字节数,为大于0小于等于32767的正整数
offset:integer类型,读取的起始位置(从文件起始物质开始计算的偏移值),大于等于0,不能大于文件结尾位置。
buffer:raw类型,读取的内容。
示例
(1)GETLENGTH、FILEOPEN函数
调用getlength获取bfile对象的长度,需创建directory对象。
---为clob时:
create table testclob(data clob);
insert into testclob values('中文测试');
select dbms_lob.getlength(data) from testclob;
---为blob时:
create table testblob(data blob);
insert into testblob values(utl_raw.cast_to_raw('中文测试'));
select dbms_lob.getlength(data) from testblob;
---为bfile时:
存在数据文件/tmp/data/bfiletest/bfile.data
create directory d_bfile as '/tmp/data/bfiletest';
create table testbfile(id number,bfile_name bfile);
insert into testbfile values(1,bfilename('d_file', 'bfile.data'));
select dbms_lob.getlength(bfile_name) from testbfile where id=1;
select dbms_lob.fileopen(bfilename('d_file', 'bfile.data'),0);
select dbms_lob.read(bfilename('d_bfile','bfile.data'), 1, 0, '');
(2)READ、FILECLOSE函数
存在数据文件/tmp/data/bfiletest/bfile.data
--创建目录和表
create directory d_bfile as '/tmp/data/bfiletest';
create table testbfile1(id number,bfile_name bfile);
--调用bfilename函数构造bfile数据并插入到表中
insert into testbfile1 values(1,bfilename('d_bfile', 'bfile.data'));
set serveroutput on;
create or replace function f_read_bfile() returns void as $$
declare
buff raw;
amount int := 0 ;
offset int :=0;
lob_loc bfile;
filesize int;
begin
select bfile_name into lob_loc from testbfile1 where id=1;
--打开BFILE文件
dbms_lob.fileopen(lob_loc,0);
--获取文件大小
filesize := dbms_lob.getlength(lob_loc);
raise notice 'amount:%',amount;
--读取文件全部内容
amount = filesize;
dbms_lob.read(lob_loc,amount,0,buff);
dbms_output.put_line('file data:');
dbms_output.put_line(utl_raw.cast_to_varchar2(buff));
--读取文件前8字节内容
amount = 8;
dbms_lob.read(lob_loc,amount,offset,buff);
dbms_output.put_line('First eight bytes:');
dbms_output.put_line(utl_raw.cast_to_varchar2(buff));
--读取文件剩余内容
offset = amount;
amount = filesize - mount;
dbms_lob.read(lob_loc,amount,offset,buff);
dbms_output.put_line('The rest bytes:');
dbms_output.put_line(utl_raw.cast_to_varchar2(buff));
--关闭bfile文件
dbms_lob.fileclose(lob_loc);
return;
end;
$$ language plpgsql;
select f_read_bfile();
--实际的返回结果应是将文件bfile.data中的对应长度的内容打印到界面