Oracle blob字段插入和导出附件

 
   一直以来都没做 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    

猜你喜欢

转载自blog.csdn.net/a_222850215/article/details/80274414
今日推荐