ORACLE之 访问 BLOB

Oracle中的BLOB类型用于存储大容量二进制数据,最大可达4GB。本文介绍了如何初始化BLOB列,通过EMPTY_BLOB()分配空间,利用DBMS_LOB包将文件内容写入和读取BLOB,以及将BLOB数据导出到二进制文件。注意在处理大BLOB数据时,需考虑适当的缓冲区大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

访问 BLOB
BLOB 用于存放大批量的二进制数据。所允许的最大数据长度为 4G 字节。在 oracle8 版本以前使用 LONG RAW 存放大批量二进制数据,且最大长度为 2G 字节。

 

示例
建立包含 BLOB 列的表

create table lob_example
(
  serial number(6) primary key,
  p_name varchar2(10),
  photo blob
);


初始化 BLOB 列
使用 EMPTY_BLOB() 初始化 BLOB 列。该函数没有提供任何数据,但是分配了 LOB 定位符。

insert into lob_example values(1, 'Zhangsan', empty_blob());
insert into lob_example values(2, 'Lisi', empty_blob());

 

将二进制文件内容写入 BLOB 列
创建 BFILE 与本地磁盘关联的目录

create or replace directory ORCL_DIR as 'D:\tools';

 

使用包 DBMS_LOB 的过程 LOADBLOBFROMFILE。

declare
  lob_loc blob;
  file_loc bfile;
  amount int;
  src_offset int := 1;
  dest_offset int := 1;
begin
  select photo into lob_loc from scott.lob_example where serial=&serial for update;
  file_loc := bfilename('ORCL_DIR', '&filename');
  dbms_lob.fileopen(file_loc, 0);
  amount := dbms_lob.getlength(file_loc);
  dbms_lob.loadblobfromfile(lob_loc, file_loc, amount, dest_offset, src_offset);
  dbms_lob.fileclose(file_loc);
  commit;
end;

 

读取 BLOB 列数据
因为 BLOB 列中存放着二进制数据,所以当读取其数据时应该使用 RAW 变量接收其数据。使用包 DBMS_LOB 的过程 READ。

declare
  lob_loc blob;
  buff raw(32767);
  amount int;
  offset int := 1;
begin
  select photo into lob_loc from scott.lob_example where serial=&serial;
  amount := dbms_lob.getlength(lob_loc);
  dbms_lob.read(lob_loc, amount, offset, buff);
end;

注:"buff raw(32767);"必须要保证足够缓冲容量。如果读取 BLOB 列的数据较大应该使用循环方式进行处理。

 

将 BLOB 列的数据写入到二进制文件
使用包 DBMS_LOB 读取 BLOB 列的数据,并且还需要使用 UTL_FILE 包建立二进制文件并写入内容。

declare
  lob_loc blob;
  buff raw(2000);
  amount int;
  offset int := 1;
  handle utl_file.file_type;
begin
  select photo into lob_loc from scott.lob_example where serial=&serial;
  amount := dbms_lob.getlength(lob_loc);
  dbms_lob.read(lob_loc, amount, offset, buff);
  handle := utl_file.fopen('ORCL_DIR', 'p.bmp', 'w', 2000);
  utl_file.put_raw(handle, buff);
  utl_file.fclose(handle);
end;

注:"buff raw(2000);"必须要保证足够缓冲容量。如果读取 BLOB 列的数据较大应该使用循环方式进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值