標籤:
好久不寫文,最近得空寫一點。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
Oracle Blob資料儲存為檔案