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