如何往数据库(Oracle)里存储图片和文件

SQL> drop table IMAGE_LOB;

表已丢弃。

SQL> CREATE TABLE IMAGE_LOB (
  2  T_ID VARCHAR2 (5) NOT NULL,
  3  T_IMAGE BLOB NOT NULL
  4  );

表已创建。

SQL> CREATE OR REPLACE DIRECTORY IMAGES AS 'C:/Inetpub/wwwroot';

目录已创建。

SQL> CREATE OR REPLACE PROCEDURE IMG_INSERT (
  2  TID           VARCHAR2,
  3  FILENAME      VARCHAR2) AS
  4     F_LOB   BFILE;
  5     B_LOB   BLOB;
  6   BEGIN
  7       INSERT INTO IMAGE_LOB (T_ID, T_IMAGE) VALUES (TID,
  8  EMPTY_BLOB ()) RETURN T_IMAGE INTO B_LOB;
  9       F_LOB:= BFILENAME ('IMAGES', FILENAME);
10       DBMS_LOB.FILEOPEN (F_LOB, DBMS_LOB.FILE_READONLY);
11       DBMS_LOB.LOADFROMFILE (B_LOB, F_LOB,
12  DBMS_LOB.GETLENGTH (F_LOB));
13       DBMS_LOB.FILECLOSE (F_LOB);
14       COMMIT;
15   END;
16  /

过程已创建。

SQL> BEGIN
  2      IMG_INSERT('1','win2000.gif');
  3   END;
  4  /

PL/SQL 过程已成功完成。

SQL> select length(t_image) from image_lob where t_id='1';

LENGTH(T_IMAGE)
---------------
           4670

//先建立表 lob_example1
create table lob_example1(
id number(6) primary key,
name varchar2(10),
resume clob
);

//插入数据
insert into lob_example1 values(1,'猪',empty_clob());
insert into lob_example1 values(2,'狗',empty_clob());
commit;

//创建目录
CREATE OR REPLACE DIRECTORY DOCS AS 'C:/';

//创建将文件内容写入数据库CLOB的存储过程
CREATE OR REPLACE PROCEDURE update_doc(
   t_id  number,
   filename varchar2
   )
as
   lobloc clob;
   fileloc bfile;
   amount int;
   src_offset int:=1;
   dest_offset int:=1;
   csid int:=0;
   lc  int:=0;
   warning int;
begin
   fileloc:=bfilename('DOCS',filename);
   dbms_lob.fileopen(fileloc,0);
   amount:=dbms_lob.getlength(fileloc);
   select resume into lobloc from lob_example1
     where id=t_id for update;
   dbms_lob.loadclobfromfile(lobloc,fileloc,amount,dest_offset,src_offset,csid,lc,warning);
   dbms_lob.fileclose(fileloc);
   commit;
end;

//调用存储过程,把文件读入数据库CLOB中
call update_doc(1,'aa.csv');
call update_doc(2,'bb.csv');

//察看id是2和1的行中文件大小
select length(resume) from lob_example1 where id=2;

select length(resume) from lob_example1 where id=1;

/文件已经放入数据库

//将文件从数据库clob中读出来
CREATE OR REPLACE PROCEDURE get_doc(
   t_id  number,
   filename varchar2
   )
as
   lobloc clob;
   amount int;
   offset int:=1;
   buffer varchar2(2000);
   handle utl_file.file_type;
begin
   select resume into lobloc from lob_example1 where id=t_id;
   amount:=dbms_lob.getlength(lobloc);
   dbms_lob.read(lobloc,amount,offset,buffer);
   handle:=utl_file.fopen('DOCS',filename,'w',2000);
   utl_file.put_line(handle,buffer);
   utl_file.fclose(handle);
end;
/
 
//调用这个过程,把文件读出来
call get_doc(1,'zz.csv');

 
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle数据库中,可以使用BLOB(Binary Large Object)数据类型来存储图片或其他二进制数据。以下是一种常见的方法来存储图片Oracle数据库: 1. 创建表:首先,创建一个包含BLOB列的表,用于存储图片及其相关信息。例如: ```sql CREATE TABLE images ( id NUMBER PRIMARY KEY, image_name VARCHAR2(100), image_data BLOB ); ``` 2. 插入图片:使用INSERT语句将图片数据插入到表中。可以使用PL/SQL或其他编程语言的数据库连接库来执行插入操作。以下是一个示例: ```sql INSERT INTO images (id, image_name, image_data) VALUES (1, 'example.jpg', EMPTY_BLOB()); COMMIT; ``` 3. 更新BLOB数据:使用UPDATE语句更新刚插入的空BLOB列,将图片数据写入BLOB中。这可以通过使用PL/SQL的DBMS_LOB包中的操作来实现。以下是一个示例: ```sql DECLARE l_blob BLOB; l_src_file BFILE; BEGIN SELECT image_data INTO l_blob FROM images WHERE id = 1 FOR UPDATE; l_src_file := BFILENAME('DIRECTORY_NAME', 'example.jpg'); DBMS_LOB.OPEN(l_src_file, DBMS_LOB.LOB_READONLY); DBMS_LOB.LoadFromFile(lob_loc => l_blob, file_loc => l_src_file, amount => DBMS_LOB.GETLENGTH(l_src_file)); DBMS_LOB.CLOSE(l_src_file); COMMIT; END; ``` 请注意,上述示例中的'DIRECTORY_NAME'应替换为Oracle数据库中已创建的目录对象的名称。该目录对象应指向存储图像文件文件系统目录。 4. 检索图片:通过SELECT语句从表中检索图片数据,并将其保存到文件系统中。以下是一个示例: ```sql DECLARE l_blob BLOB; l_dest_file BFILE; BEGIN SELECT image_data INTO l_blob FROM images WHERE id = 1; l_dest_file := BFILENAME('DIRECTORY_NAME', 'retrieved_example.jpg'); DBMS_LOB.fileopen(l_dest_file, DBMS_LOB.file_readonly); DBMS_LOB.LOADCLOBFROMFILE(lob_loc => l_blob, file_loc => l_dest_file, amount => DBMS_LOB.GETLENGTH(l_dest_file)); DBMS_LOB.fileclose(l_dest_file); COMMIT; END; ``` 这将从数据库中检索图像,并将其保存为'retrieved_example.jpg'文件。 注意:在存储大型图像或大量图像时,应考虑数据库的性能和存储需求。可以使用压缩、分区或外部表等技术来优化图像存储和检索的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值