向数据库中存储以及读取BLOB对象

来源:互联网 发布:标准肌肉身材软件 编辑:程序博客网 时间:2024/05/06 11:57
对LOB类型的数据是很特殊的,读取以及存储都与一般的类型不同:
1、存储BLOB类型:
首先需要建一个directory ,用来存放图片的文件夹地址:

SQL> select * from all_directories;

OWNER                           DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ ------------------------------ ------------------------------------------------------
SYS                                      BLOBDIR                                   d:\expdb_dirc
新建表
SQL> CREATE TABLE daimin_blob (
  2        fid      number,
  3        fname            varchar2(50),
  4        fdesc  varchar2(200),
  5        fpic              BLOB);

Table created

SQL>
SQL>  create sequence S_daimin_SEQ
  2        start with 1
  3        increment by 1
  4  /

Sequence created
创建下面的存储过程:
-创建一个读入文件的过程。
CREATE OR REPLACE PROCEDURE daimin_load_blob (pfname VARCHAR2,pdesc varchar2)
      IS
      src_file BFILE;
      dst_file BLOB;
      lgh_file BINARY_INTEGER;
      BEGIN
            src_file := bfilename('BLOBDIR' , pfname);   --读取原文件的内容
          INSERT INTO daimin_blob  (fid,fname,fdesc,fpic)
          VALUES (S_daimin_SEQ.Nextval,pfname,pdesc,EMPTY_BLOB())   --   注意BLOB类型的字段在插入操作的时候的  必须先初始化为EMPTY_BLOB(),再做更新操作更新为自己想插入的内容
          RETURNING fpic INTO dst_file;
 
          SELECT fpic INTO dst_file
          FROM daimin_blob  WHERE fname = pfname FOR UPDATE;
 
          dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
          lgh_file := dbms_lob.getlength(src_file);
          dbms_lob.loadfromfile(dst_file, src_file, lgh_file);    --从文件中向数据库加载图片到BLOB类型的变量
        UPDATE daimin_blob  SET fpic = dst_file
        WHERE fname = pfname;      --   再作更新操作更新为加载后的内容
          dbms_lob.fileclose(src_file);
        commit;
    END
SQL> exec daimin_load_blob( 'lvback.gif' , 'ddddd' );

PL/SQL procedure successfully completed

SQL> col fdesc format a20;
SQL> col fname format a20;
SQL> select * from daimin_blob ;

       FID FNAME                FDESC                FPIC
---------- -------------------- -------------------- ----
         1 lvback.gif           ddddd                <BLO
读取BLOB类型

CREATE OR REPLACE PROCEDURE daimin_dump_blob (piname varchar2,poname varchar2) IS
        l_file          UTL_FILE.FILE_TYPE;
        l_buffer      RAW(32767);
          l_amount      BINARY_INTEGER := 32767 ;
          l_pos            INTEGER := 1 ;
          l_blob          BLOB ;
          l_blob_len  INTEGER ;
      BEGIN
          SELECT FPIC
        INTO          l_blob
        FROM          daimin_blob
        WHERE  FNAME = piname ;   
 
        l_blob_len := DBMS_LOB.GETLENGTH(l_blob) ;
        l_file := UTL_FILE.FOPEN('BLOBDIR' ,poname, 'wb' , 32767); --以可写模式打开文件并将文件的handle返回 
        WHILE l_pos < l_blob_len LOOP
            DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer); -- 读取文件中的内容,并写到文件中
            UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE);-- 将上面读出到buffer的数据fresh了下
          l_pos := l_pos + l_amount ;
        END LOOP;
 
        UTL_FILE.FCLOSE(l_file);
 
    EXCEPTION
        WHEN OTHERS THEN
            IF UTL_FILE.IS_OPEN(l_file) THEN
                UTL_FILE.FCLOSE(l_file);            
            END IF;
            RAISE;
    END;
   
SQL> exec daimin_dump_blob('lvback.gif','03.jpg');

PL/SQL procedure successfully completed
执行上面的语句,则在 d:\expdb_dirc文件夹下发现有新的图片 03.jpg 存在,说明读取成功。
0 0
原创粉丝点击