如何将图片导入到Oracle数据库
前言
主要介绍使用Oracle函数包dbms_lob如何将图片存到数据库里面。关于函数的更多用法可以阅读官方文档(https://docs.oracle.com/cd/E11882_01/timesten.112/e21645/d_lob.htm#TTPLP600)
建立测试表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
prompt
prompt Creating table T_PIC_1
prompt =============================
prompt
create table T_PIC_1
(
ID NUMBER(10) not null,
ZP BLOB
)
;
comment on table T_PIC_1
is '测试数据表';
comment on column T_PIC_1.ID
is '照片唯一ID ';
comment on column T_PIC_1.ZP
is '照片';
-- alter table T_PIC_1 add constraint PK_T_PIC_1 primary key (ID);
prompt
prompt Creating sequence SEQ_T_PIC_1
prompt ================================
prompt
create sequence SEQ_T_PIC_1
minvalue 1
maxvalue 9999999999999999999999999999
start with 1
increment by 1
cache 200;
图片路径
1
2
3
4
5
6
[oracle@db-Bbo8Jg1B zp]$ pwd
/home/oracle/zp
[oracle@db-Bbo8Jg1B zp]$ ls -lrt
-rw-r--r-- 1 root root 42775 Jun 2 13:56 20200602135647.jpg
-rw-r--r-- 1 root root 44189 Jun 2 13:59 20200602135648.jpg
建立逻辑目录
1
2
3
4
SQL> create or replace directory IMAGES as '/home/oracle/zp';
SQL> grant read,write on directory IMAGES to u_test1;
入库方式
特定命名规则循环入库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[oracle@db-Bbo8Jg1B ~]$ cd /home/oracle/zp/
[oracle@db-Bbo8Jg1B zp]$ i=0;for img in *.jpg;do ((i++));mv "$img" ${i}.jpg;done
[oracle@db-Bbo8Jg1B zp]$ ls -l
-rw-r--r-- 1 oracle oinstall 42775 Jun 2 13:56 1.jpg
-rw-r--r-- 1 oracle oinstall 44189 Jun 2 13:59 2.jpg
[oracle@db-Bbo8Jg1B zp]$ sqlplus u_test1/u_test1
declare
l_blob blob;
l_bfile bfile;
begin
for i in 1 .. 2 loop
-- 确认好表与表字段
insert into T_PIC_1
(ID, ZP)
values
(i, empty_blob())
returning ZP into l_blob;
-- 照片的命名必须为规则的从1到10w,如:10.jpg , IMAGES代表逻辑目录名称
l_bfile := bfilename('IMAGES', i || '.jpg');
dbms_lob.fileopen(l_bfile);
dbms_lob.loadfromfile(l_blob, l_bfile, dbms_lob.getlength(l_bfile));
dbms_lob.fileclose(l_bfile);
end loop;
commit; -- 可自行调整为单次commit或者批量commit
end;
/
可以使用PLSQL去查看下表:
使用存储过程的方式入库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE OR REPLACE PROCEDURE IMG_INSERT_ACS(FILENAME VARCHAR2) AS
F_LOB BFILE;
B_LOB BLOB;
BEGIN
INSERT /*+ append */
INTO T_PIC_1
(ID, ZP)
VALUES
-- ID通过调用序列SEQ_T_PIC_1取唯一自增值,IMAGES代表逻辑目录名称
(seq_T_PIC_1.nextval, EMPTY_BLOB()) RETURN ZP INTO B_LOB;
F_LOB := BFILENAME('IMAGES', 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;
/
1
2
3
4
5
6
7
begin
-- Call the procedure
img_insert_acs(filename => '1.jpg');
end;
/
再去通过PLSQL查看表: