文档或图片等文件在数据库表中以blob字段存储并读取的方法:
1、将文件以blob形式存放到数据库:参考 http://bbs.csdn.net/topics/330265813
CREATE TABLE yuser (ID number,photo BLOB);--首先要创建目录将需要存放到数据库的文件放到该目录中create or replace directory images as 'D:\images';SELECT *FROM dba_directories--然后将这些文件读取存放到数据库 declare l_bfile bfile; l_blob blob; begin insert into yuser(ID,photo) values(1,empty_blob()) return photo into l_blob; l_bfile:=bfilename('IMAGES','...test.doc'); dbms_lob.open(l_bfile,dbms_lob.file_readonly); dbms_lob.loadfromfile(l_blob,l_bfile,dbms_lob.getlength(l_bfile)); dbms_lob.close(l_bfile); commit; end; 2.Oracle导出Blob存储的图像或文件到指定目录:参考 http://www.cnblogs.com/dayrl/articles/1595879.html--首先要先创建这些文件读取后存放的目录
create or replace directory images2 as 'D:\images2';
CREATE OR REPLACE PROCEDURE b_wzzp_dump(locationno IN NUMBER, filename IN VARCHAR2) IS l_file utl_file.file_type; l_buffer RAW(32767); l_amount BINARY_INTEGER := 32767; l_pos INTEGER := 1; l_blob BLOB; l_blob_len INTEGER;BEGIN SELECT photo INTO l_blob FROM yuser WHERE id = locationno; l_blob_len := dbms_lob.getlength(l_blob); l_file := utl_file.fopen('IMAGES2', filename, 'w', /*l_blob_len*/32767); WHILE l_pos < l_blob_len LOOP dbms_lob.read(l_blob, l_amount, l_pos, l_buffer); utl_file.put_raw(l_file, l_buffer, TRUE); l_pos := l_pos + l_amount; END LOOP; utl_file.fclose(l_file);EXCEPTION WHEN OTHERS THEN dbms_output.put_line(SQLERRM); IF utl_file.is_open(l_file) THEN utl_file.fclose(l_file); END IF; RAISE;END b_wzzp_dump;execute b_wzzp_dump(locationno => 指定表中的哪个文件,filename => filename);上述用到的一些包过程说明:dbms_lob.read——读取文件dbms_lob.read(lob_loc => blob字段,amount => 每次读取的字符数,offset => 从哪开始读取,buffer => 缓存量);dbms_lob.getlength——获取blob对象的长度dbms_lob.getlength(lob_loc => 对应的bLOB字段);utl_file.fopen——打开文件utl_file.fopen(location => 文件所在的目录,filename => 文件名称,open_mode =>打开方式(R/W/A) ,max_linesize => 文件每行最大的字符数,不能超过32767,最小为1,默认为null,表示操作系统运行时指定的值);注:max_linesize不能超过32767,如果超过则提示“ORA-29287: 最大行大小无效”utl_file.put_raw——将raw数据写入文件utl_file.put_raw(file => 文件类型,buffer => 存放raw数据的缓存,autoflush => 是自动刷新缓冲区数据);utl_file.is_open——判断文件是否打开,返回true或falseutl_file.is_open(file => 文件名);utl_file.fclose——关闭文件utl_file.fclose(file => 文件名);