rondon
rondon I'm a Oracle DBA(Database Administrator).

如何将图片导入到Oracle数据库


如何将图片导入到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查看表:

comments powered by Disqus