你的位置:首页 > 数据库

[数据库]Oracle Blob数据保存为文件


    好久不写文,最近得空写一点。Oracle数据库国内用户量主要在企业上,其中有一种byte的存储称为Blob,并不能直接看。

    有时候为了调试需要,可以通过:

select UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(xxx,2000,1)) from xxx where xxx = 9667796;

    这种sql去转为字符串查看,但是不方便,一次最多转出2000个字节。需要通过index拼成完整的文本。

    另外一种情况下,如果存储的是图片、word或其它非文本格式的二进制文档时,就没办法通过上面的方法进行查看了。我这里介绍一种方式可以把Blob保存到数据库服务器所在机器的本地磁盘中去。

   

    存储过程:

 1 CREATE OR REPLACE  2 PROCEDURE SaveBlob(filename VARCHAR) 3 AS 4   v_lob_loc   BLOB; 5   v_buffer    RAW(32767); 6   v_buffer_size BINARY_INTEGER; 7   v_amount    BINARY_INTEGER; 8   v_offset    NUMBER(38) := 1; 9   v_chunksize  INTEGER;10   v_out_file   UTL_FILE.FILE_TYPE;11 12 BEGIN13   -- 查询条件(此处根据需求修改)14   SELECT content15   INTO  v_lob_loc16   FROM  obj_code_file17   WHERE  id = 9667793;18 19   -- 大小20   v_chunksize := DBMS_LOB.GETCHUNKSIZE(v_lob_loc);21   IF (v_chunksize < 32767) THEN22     v_buffer_size := v_chunksize;23   ELSE24     v_buffer_size := 32767;25   END IF;26   v_amount := v_buffer_size;27 28   -- 打开29   DBMS_LOB.OPEN(v_lob_loc, DBMS_LOB.LOB_READONLY);30 31   -- 写入32   v_out_file := UTL_FILE.FOPEN(33     location   => 'EXPDP_DIR', 34     filename   => filename, 35     open_mode   => 'wb',36     max_linesize => 32767);37 38   WHILE v_amount >= v_buffer_size39   LOOP40    DBMS_LOB.READ(41      lob_loc  => v_lob_loc,42      amount   => v_amount,43      offset   => v_offset,44      buffer   => v_buffer);45    v_offset := v_offset + v_amount;46    UTL_FILE.PUT_RAW (47      file   => v_out_file,48      buffer  => v_buffer,49      autoflush => true);50    UTL_FILE.FFLUSH(file => v_out_file);51   END LOOP;52   UTL_FILE.FFLUSH(file => v_out_file);53   UTL_FILE.FCLOSE(v_out_file);54 55   -- 关闭文件56   DBMS_LOB.CLOSE(v_lob_loc);57 END;

    把存储过程导入到Oracle中,通过SaveBlob()来调用,参数是要保存的文件名。保存的目录在'EXPDP_DIR'中,通过:

select * from ALL_DIRECTORIES;

    可以查看此目录对应的物理路径。

    执行完存储过程后,就可以看到导出后的二进制文件了。

    转载请注明原址:http://www.cnblogs.com/lekko/p/5624748.html