Oracle中大对象类型bfile的使用总结

博客中已经总结了挺多有关大对象lob的文章了,本篇文章主要总结lob中的bfile类型。在总结bfile之前,先回顾下有关lob的基础知识,lob大对象类型主要用于存储非结构化的大数据,比如大文本、图片、电影、音乐等。oracle数据库中的lob主要有四种类型:clob(字符大对象,存储在数据库内部)、nclob(多字节字符大对象,存储在数据库内部)、blob(二进制大对象,存储在数据库内部)、bfile(二进制文件,存储在数据库外部)。long和long raw类型是oracle 9i以前的版本使用的大对象类型,在oracle 9i以后的版本中都建议使用lob。lob的存储包括value和locator两部分,前者是值,后者是定位器,oracle数据库表上的lob字段,存储的是lob的locator,至于lob的value,则要看具体的lob类型。

对于内部lob而言(blob、clob、nclob),一般的操作步骤为:

(1)在表中添加lob类型列。

(2)在程序中声明和初始化lob的locator,初始化locator可以在定义列的时候就直接默认的用相应的empty方法初始化一下,也可以在插入的时候用empty方法初始化。

(3)使用select into for update锁定目标记录,更新目标记录上的lob列。

(4)使用dbms_lob包生成lob对象。

(5)commit提交。

上面的内部lob的操作不是本文的重点,下面重点总结外部大对象类型bfile的操作,bfile是数据库外部文件,是只读的,所以不参与事务操作,用户必须先创建文件并放到特定的目录下,并且要授予oracle进程以目录和文件的读取权限。在oracle中删除bfile,其实它并没有实际的去删除对应的操作系统上的文件,实际文件的删除是DBA的工作,bfile的大小限制取决于操作系统,不受oracle限制。

操作bfile的一般步骤为:

(1)在操作系统上创建目录,并给oracle数据库进程授予读取权限,把外部文件放入这个目录。

(2)在oracle数据库表添加bfile类型字段。

ALTER TABLE employees ADD emp_video BFILE;

(3)在oracle数据库中创建directory对象。

CREATE DIRECTORY dir_name AS os_path;

(4)授予读取权限给特定的数据库用户或角色。

GRANT READ ON DIRECTORY dir_name TO user|role|PUBLIC;

(5)往表中插入记录,注意对于bfile类型列插入数据时使用bfilename函数。

UPDATE employees
   SET emp_video = bfilename('LOG_FILES', -- directory alias
                             'King.avi') -- filename
 WHERE employee_id = 100;

(6)在程序中声明和初始化locator。

(7)select指定行上的bfile列到locator。

(8)使用dbms_lob读取bfile,locator作为文件的引用。

bfile操作示例:

CREATE OR REPLACE PROCEDURE load_emp_bfile(p_file_loc IN VARCHAR2) IS
  v_file     BFILE;
  v_filename VARCHAR2(16);
  CURSOR emp_cursor IS
    SELECT first_name
      FROM employees
     WHERE department_id = 60
       FOR UPDATE;
BEGIN
  FOR emp_record IN emp_cursor
  LOOP
    v_filename := emp_record.first_name || '.bmp';
    v_file     := bfilename(p_file_loc,
                            v_filename);
    dbms_lob.fileopen(v_file);
    UPDATE employees
       SET emp_video = v_file
     WHERE CURRENT OF emp_cursor;
    dbms_output.put_line('LOADED FILE: ' || v_filename || ' SIZE: ' || dbms_lob.getlength(v_file));
    dbms_lob.fileclose(v_file);
  END LOOP;
END load_emp_bfile;

检查bfile文件是否存在:

CREATE OR REPLACE PROCEDURE load_emp_bfile(p_file_loc IN VARCHAR2) IS
  v_file        BFILE;
  v_filename    VARCHAR2(16);
  v_file_exists BOOLEAN;
  CURSOR emp_cursor IS ...;
BEGIN
  FOR emp_record IN emp_cursor
  LOOP
    v_filename    := emp_record.first_name || '.bmp';
    v_file        := bfilename(p_file_loc,
                               v_filename);
    v_file_exists := (dbms_lob.fileexists(v_file) = 1);
    IF v_file_exists THEN
      dbms_lob.fileopen(v_file);

这篇文章大概的介绍了bfile的操作思路,光看这一篇应该会对lob还有很多疑惑,可以参加博客中《Oracle中DBMS_LOB包使用小结》、《Oracle数据库中使用dbms_lob.converttoclob和dbms_lob.converttoblob转换blob、clob大对象类型总结》、《Oracle数据库中chr()、ascii()、asciistr()、convert()函数的使用(附ASCII编码表)》、《收藏的一段oracle数据库中blob类型按指定编码转换为blob、clob、字符串类型的代码》这几篇文章,看完后应该会有一个整体的了解,lob用的不是特别频繁,记住几个例子也就会用了。

本文标题:Oracle中大对象类型bfile的使用总结

本文链接:http://yedward.net/?id=171

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章