一直以来都没做 oracle 数据库中 blob字段插入图片的实验,今天抽空在网上找了些相关文章并整理了一下,做了如下实验,再此首先感谢一下网上共享文章的大牛们,没有你们的分享或许就没有这篇文章的诞生。
下面就是具体的实验步骤,希望能给大家带来帮助,有哪些不足的也希望大家评论补充,先谢了。
实验的大体内容为:
1、 把各种格式的文件(.jpg .doc .txt .xls .zip) 保存到 blob字段中。
2、 把数据库中 blob字段的内容导出来,并检验导出的文件是否还可用。
(1) 创建目录,并保证目录存在,oracle用户具有读写权限
SQL> create or replace directory file_dir as '/home/oracle/file/';
(2) 创建文件,后面将会把这五种不同格式的文件导入到数据库中
[root@server139 file]# pwd
/home/oracle/file
[root@server139 file]# ls
wu.jpg xiaowu.doc xiaowu.txt xiaowu.xls xiaowu.zip
[root@server139 file]#
(3) 建表
SQL> create table io_blob
2 (id number,
3 suffix varchar2(10),
4 content blob);
Table created.
(4)编写导入的存储过程
[root@server139 oracle]# cat blob_insert.sql
create or replace procedure blob_insert
(tid varchar2,tsuffix varchar2,filename varchar2)
as
l_loc all_directories.directory_name%TYPE :='FILE_DIR';
f_lob bfile;
b_lob blob;
begin
insert into io_blob( id,suffix,content)
values(tid,tsuffix,empty_blob()) return contentinto b_lob;
f_lob:=bfilename(l_loc,filename);
dbms_lob.fileopen(f_lob,dbms_lob.file_readonly);
dbms_lob.loadfromfile(b_lob,f_lob,
dbms_lob.getlength(f_lob));
dbms_lob.fileclose(f_lob);
commit;
end;
/
(5) 执行存储过程
SQL> @blob_insert
Procedure created.
SQL> exec blob_insert(1,'jpg','wu.jpg');
PL/SQL procedure successfully completed.
SQL> exec blob_insert(2,'doc','xiaowu.doc');
PL/SQL procedure successfully completed.
SQL> exec blob_insert(3,'txt','xiaowu.txt');
PL/SQL procedure successfully completed.
SQL> exec blob_insert(4,'xls','xiaowu.xls');
PL/SQL procedure successfully completed.
SQL> exec blob_insert(5,'zip','xiaowu.zip');
PL/SQL procedure successfully completed.
(6) 查询执行结果,确保附件数据确实执行成功
SQL> set long 9
SQL> select * from io_blob;
1jpg FFD8FFE000104A4649
2doc D0CF11E0A1B11AE100
3txt 7869616F777572710A
4xls D0CF11E0A1B11AE100
5zip 504B03041400000008
SQL> selectid,suffix,utl_raw.cast_to_varchar2(dbms_lob.substr(content,20,1))var1 from io_blob;
IDSUFFIX VAR1
---------- --------------------------------------------------
1jpg JFIF
2doc 邢唷
3txt xiaowurq
肖舞
4xls 邢唷
5zip PK J€zED嫤*g#
到此把附件存放到数据库的过程已经完成。(我们可以看到txt格式的文件插入数据库了,是可以直接查处内容的)
下面来演示从数据库中导出附件:
(7)首先备份源文件,或者导出的时候以其他名称导出
[root@server139 file]# ls
wu.jpg xiaowu.doc xiaowu.txt xiaowu.xls xiaowu.zip
[root@server139 file]# mkdir bak
[root@server139 file]# mv *.* bak
[root@server139 file]# ls
bak
[root@server139 file]#
(8)编写导出的存储过程
[root@server139 oracle]# cat blob_output.sql
create or replace procedure blob_output
(v_id INTEGER,
outname varchar2)
is
l_loc all_directories.directory_name%TYPE := 'FILE_DIR';
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 content into l_blob from io_blob whereid=v_id;
l_blob_len:=dbms_lob.getlength(l_blob);
l_file:=UTL_FILE.FOPEN(l_loc,outname,'wb',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
ifutl_file.is_open(l_file) then
utl_file.fclose(l_file);
endif;
raise;
end;
/
(9) 执行存储过程
SQL> @blob_output
Procedure created.
SQL> exec blob_output(1,'WU.jpg');
PL/SQL procedure successfully completed.
SQL> exec blob_output(2,'xiaowu.doc');
PL/SQL procedure successfully completed.
SQL> exec blob_output(3,'xiaowu.txt');
PL/SQL procedure successfully completed.
SQL> exec blob_output(4,'xiaowu.xls');
PL/SQL procedure successfully completed.
SQL> exec blob_output(5,'xiaowu.zip');
PL/SQL procedure successfully completed.
(10) 下载导出的文件,并检验文件是否可用
[root@server139 file]# sz *.*
rz
开始 zmodem 传输。 按 Ctrl+C 取消。
100% 9 KB 9 KB/s00:00:01 0 Errors
100% 29 KB 29 KB/s00:00:01
下面就是具体的实验步骤,希望能给大家带来帮助,有哪些不足的也希望大家评论补充,先谢了。
实验的大体内容为:
1、 把各种格式的文件(.jpg .doc .txt .xls .zip) 保存到 blob字段中。
2、 把数据库中 blob字段的内容导出来,并检验导出的文件是否还可用。
(1) 创建目录,并保证目录存在,oracle用户具有读写权限
SQL> create or replace directory file_dir as '/home/oracle/file/';
(2) 创建文件,后面将会把这五种不同格式的文件导入到数据库中
[root@server139 file]# pwd
/home/oracle/file
[root@server139 file]# ls
wu.jpg xiaowu.doc xiaowu.txt xiaowu.xls xiaowu.zip
[root@server139 file]#
(3) 建表
SQL> create table io_blob
2 (id number,
3 suffix varchar2(10),
4 content blob);
Table created.
(4)编写导入的存储过程
[root@server139 oracle]# cat blob_insert.sql
create or replace procedure blob_insert
(tid varchar2,tsuffix varchar2,filename varchar2)
as
l_loc all_directories.directory_name%TYPE :='FILE_DIR';
f_lob bfile;
b_lob blob;
begin
insert into io_blob( id,suffix,content)
values(tid,tsuffix,empty_blob()) return contentinto b_lob;
f_lob:=bfilename(l_loc,filename);
dbms_lob.fileopen(f_lob,dbms_lob.file_readonly);
dbms_lob.loadfromfile(b_lob,f_lob,
dbms_lob.getlength(f_lob));
dbms_lob.fileclose(f_lob);
commit;
end;
/
(5) 执行存储过程
SQL> @blob_insert
Procedure created.
SQL> exec blob_insert(1,'jpg','wu.jpg');
PL/SQL procedure successfully completed.
SQL> exec blob_insert(2,'doc','xiaowu.doc');
PL/SQL procedure successfully completed.
SQL> exec blob_insert(3,'txt','xiaowu.txt');
PL/SQL procedure successfully completed.
SQL> exec blob_insert(4,'xls','xiaowu.xls');
PL/SQL procedure successfully completed.
SQL> exec blob_insert(5,'zip','xiaowu.zip');
PL/SQL procedure successfully completed.
(6) 查询执行结果,确保附件数据确实执行成功
SQL> set long 9
SQL> select * from io_blob;
1jpg FFD8FFE000104A4649
2doc D0CF11E0A1B11AE100
3txt 7869616F777572710A
4xls D0CF11E0A1B11AE100
5zip 504B03041400000008
SQL> selectid,suffix,utl_raw.cast_to_varchar2(dbms_lob.substr(content,20,1))var1 from io_blob;
IDSUFFIX VAR1
---------- --------------------------------------------------
1jpg JFIF
2doc 邢唷
3txt xiaowurq
肖舞
4xls 邢唷
5zip PK J€zED嫤*g#
到此把附件存放到数据库的过程已经完成。(我们可以看到txt格式的文件插入数据库了,是可以直接查处内容的)
下面来演示从数据库中导出附件:
(7)首先备份源文件,或者导出的时候以其他名称导出
[root@server139 file]# ls
wu.jpg xiaowu.doc xiaowu.txt xiaowu.xls xiaowu.zip
[root@server139 file]# mkdir bak
[root@server139 file]# mv *.* bak
[root@server139 file]# ls
bak
[root@server139 file]#
(8)编写导出的存储过程
[root@server139 oracle]# cat blob_output.sql
create or replace procedure blob_output
(v_id INTEGER,
outname varchar2)
is
l_loc all_directories.directory_name%TYPE := 'FILE_DIR';
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 content into l_blob from io_blob whereid=v_id;
l_blob_len:=dbms_lob.getlength(l_blob);
l_file:=UTL_FILE.FOPEN(l_loc,outname,'wb',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
ifutl_file.is_open(l_file) then
utl_file.fclose(l_file);
endif;
raise;
end;
/
(9) 执行存储过程
SQL> @blob_output
Procedure created.
SQL> exec blob_output(1,'WU.jpg');
PL/SQL procedure successfully completed.
SQL> exec blob_output(2,'xiaowu.doc');
PL/SQL procedure successfully completed.
SQL> exec blob_output(3,'xiaowu.txt');
PL/SQL procedure successfully completed.
SQL> exec blob_output(4,'xiaowu.xls');
PL/SQL procedure successfully completed.
SQL> exec blob_output(5,'xiaowu.zip');
PL/SQL procedure successfully completed.
(10) 下载导出的文件,并检验文件是否可用
[root@server139 file]# sz *.*
rz
开始 zmodem 传输。 按 Ctrl+C 取消。
100% 9 KB 9 KB/s00:00:01 0 Errors
100% 29 KB 29 KB/s00:00:01