zoukankan      html  css  js  c++  java
  • 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 BEGIN
    13     -- 查询条件(此处根据需求修改)
    14     SELECT  content
    15     INTO    v_lob_loc
    16     FROM    obj_code_file
    17     WHERE   id = 9667793;
    18 
    19     -- 大小
    20     v_chunksize := DBMS_LOB.GETCHUNKSIZE(v_lob_loc);
    21     IF (v_chunksize < 32767) THEN
    22         v_buffer_size := v_chunksize;
    23     ELSE
    24         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_size
    39     LOOP
    40       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

  • 相关阅读:
    实现一个圆形进度条
    给你的jQuery项目赋予Router技能吧
    matlab新手入门(四)(翻译)
    matlab新手入门(三)(翻译)
    matlab新手入门(二)(翻译)
    matlab新手入门(一)(翻译)
    安装Matlab出现Error 1935错误解决方法
    Linux Ubuntu下Jupyter Notebook的安装
    lung 分割论文
    链表的回文结构
  • 原文地址:https://www.cnblogs.com/lekko/p/5624748.html
Copyright © 2011-2022 走看看