Oracle数据库中对BLOB数据的操作问题

日期: 2012-01-18 作者:Karen Morton翻译:孙瑞 来源:TechTarget中国

问:请问在Oracle数据库中,如何插入并检索二进制大对象数据(BLOB)?

  答:我建议在处理大对象数据之前,先阅读一下“Oracle应用开发者指南”中的大对象部分。

  下面给出的链接就是在线版本,其中14章给出了一些插入和读取BLOB的例子:

  http://docs.oracle.com/cd/B19306_01/appdev.102/b14249/toc.htm

  14章

  http://docs.oracle.com/cd/B19306_01/appdev.102/b14249/adlob_lob_ops.htm#i1024873

  下面我通过一个具体的实例,来演示如何将外部文件导入一个BLOB列中:

  第一步:创建一个目录,指向BLOB的位置。将“blob_dir”替换成“/oradata/blobs”。

  第二步:为使用该目录的用户提供可读授权。

  第三步:创建大对象表。

  – the storage table for the image file
  CREATE TABLE my_blobs (
  dname VARCHAR2(30), — directory name
  sname VARCHAR2(30), — subdirectory name or description
  fname VARCHAR2(30), — file name
  fblob BLOB); — blob file

  第四步:创建一个存储过程,用来插入BLOB对象。

  – create the procedure to load the blob file
  CREATE OR REPLACE PROCEDURE load_blob (
  pdname VARCHAR2,
  psname VARCHAR2,
  pfname VARCHAR2) IS
  src_file BFILE;
  dst_file BLOB;
  lgh_file BINARY_INTEGER;
  BEGIN
  src_file := bfilename(‘BLOB_DIR’, pfname);
  – insert a NULL record to lock
  INSERT INTO my_blobs
  (dname, sname, fname, fblob)
  VALUES
  (pdname, psname, pfname, EMPTY_BLOB())
  RETURNING fblob INTO dst_file;
  – lock record
  SELECT fblob
  INTO dst_file
  FROM my_blobs
  WHERE dname = pdname
  AND sname = psname
  AND fname = pfname
  FOR UPDATE;
  – open the file
  dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
  – determine length
  lgh_file := dbms_lob.getlength(src_file);
  – read the file
  dbms_lob.loadfromfile(dst_file, src_file, lgh_file);
  – update the blob field
  UPDATE my_blobs
  SET fblob = dst_file
  WHERE dname = pdname
  AND sname = psname
  AND fname = pfname;
  – close file
  dbms_lob.fileclose(src_file);
  END load_file;
  /

  第五步:执行存储过程。

  SQL> exec load_blob(‘BLOB_DIR’,’Head shot photo’,’km_pic.png’);
  PL/SQL procedure successfully completed.

  你现在可以通过检查大小,来验证原始对象与数据库对象的匹配。

  第六步:从OS上检查BLOB大小。

  SQL> !ls -l /oradata/blobs/km_pic.png
  -rwxr-xr-x 1 oracle oinstall 21150 Jan 6 01:55 /oradata/blobs/km_pic.png

  第七步:从Oracle检查BLOB大小。

  1 declare
  2 a blob;
  3 begin
  4 select fblob into a from my_blobs;
  5 dbms_output.put_line(dbms_lob.getlength(a));
  6* end;
  SQL> /
  21150
  PL/SQL procedure successfully completed.

  您可以通过阅读相关文档来获取更多关于BLOB数据的知识,学习Oracle数据库是一个积累的过程,祝您好运!

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

翻译

孙瑞
孙瑞

相关推荐