程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle Blob數據保存為文件,oracleblob數據保存

Oracle Blob數據保存為文件,oracleblob數據保存

編輯:Oracle教程

Oracle Blob數據保存為文件,oracleblob數據保存


    好久不寫文,最近得空寫一點。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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved