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

  • 相关阅读:
    【数学】三分法
    【数学】【背包】【NOIP2018】P5020 货币系统
    【数学】【CF27E】 Number With The Given Amount Of Divisors
    【单调队列】【P3957】 跳房子
    【极值问题】【CF33C】 Wonderful Randomized Sum
    【DP】【CF31E】 TV Game
    【神仙题】【CF28D】 Don't fear, DravDe is kind
    【线段树】【CF19D】 Points
    【字符串】KMP字符串匹配
    【二维树状数组】【CF10D】 LCIS
  • 原文地址:https://www.cnblogs.com/lekko/p/5624748.html
Copyright © 2011-2022 走看看