Oracle Blob数据保存为文件

时间:2022-08-12 08:37:05

好久不写文,最近得空写一点。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保存到数据库服务器所在机器的本地磁盘中去。

存储过程:

 CREATE OR REPLACE
PROCEDURE SaveBlob(filename VARCHAR)
AS
v_lob_loc BLOB;
v_buffer RAW(32767);
v_buffer_size BINARY_INTEGER;
v_amount BINARY_INTEGER;
v_offset NUMBER(38) := 1;
v_chunksize INTEGER;
v_out_file UTL_FILE.FILE_TYPE; BEGIN
-- 查询条件(此处根据需求修改)
SELECT content
INTO v_lob_loc
FROM obj_code_file
WHERE id = 9667793; -- 大小
v_chunksize := DBMS_LOB.GETCHUNKSIZE(v_lob_loc);
IF (v_chunksize < 32767) THEN
v_buffer_size := v_chunksize;
ELSE
v_buffer_size := 32767;
END IF;
v_amount := v_buffer_size; -- 打开
DBMS_LOB.OPEN(v_lob_loc, DBMS_LOB.LOB_READONLY); -- 写入
v_out_file := UTL_FILE.FOPEN(
location => 'EXPDP_DIR',
filename => filename,
open_mode => 'wb',
max_linesize => 32767); WHILE v_amount >= v_buffer_size
LOOP
DBMS_LOB.READ(
lob_loc => v_lob_loc,
amount => v_amount,
offset => v_offset,
buffer => v_buffer);
v_offset := v_offset + v_amount;
UTL_FILE.PUT_RAW (
file => v_out_file,
buffer => v_buffer,
autoflush => true);
UTL_FILE.FFLUSH(file => v_out_file);
END LOOP;
UTL_FILE.FFLUSH(file => v_out_file);
UTL_FILE.FCLOSE(v_out_file); -- 关闭文件
DBMS_LOB.CLOSE(v_lob_loc);
END;

把存储过程导入到Oracle中,通过SaveBlob()来调用,参数是要保存的文件名。保存的目录在'EXPDP_DIR'中,通过:

select * from ALL_DIRECTORIES;

可以查看此目录对应的物理路径。

执行完存储过程后,就可以看到导出后的二进制文件了。

转载请注明原址:http://www.cnblogs.com/lekko/p/5624748.html