首页 > 解决方案 > 无法将 BLOB 数据插入表中

问题描述

我正在尝试将图像存储在 blob 列中。我使用以下代码创建了表 job_resumes2:

create table job_resumes2(
resume_id number,
first_name varchar2(25),
last_name varchar2(25),
profile_picture blob);

然后我创建了一个目录:

create directory myimages as 'C:\MYIMAGES';

然后我执行了以下过程来填充表,但执行时出现错误:

SQL> DECLARE
  2  SRC bfile := bfilename('MYIMAGES','x.jpg');
  3  dest blob;
  4  begin
  5  insert into job_resumes2 values(1,'John','M',empty_blob())
  6  returning profile_picture into dest;
  7  dbms_lob.open(src,dbms_lob.lob_readonly);
  8  dbms_lob.loadfromfile(dest,src,dbms_lob.getlength(src));
  9  dbms_lob.close(src);
 10  commit;
 11  end;
 12  /
DECLARE
*
ERROR at line 1:
ORA-22288: file or LOB operation FILEOPEN failed
The data is invalid.
ORA-06512: at "SYS.DBMS_LOB", line 1031
ORA-06512: at line 7

我已确保目录和文件 x.jpg 存在。有什么问题,我能做些什么来解决它?

标签: sqloracle12c

解决方案


数据库安装在哪里?是在你的电脑上吗?因为,目录必须驻留在数据库服务器上(或者可以访问它 - 如果它在其他地方,请使用 UNC 来创建它)。"C:\temp" 看起来像是您自己的 PC,所以 - 它可能无法正常工作。

从权限开始:目录(作为 Oracle 对象)归 SYS 所有,SYS 必须向将使用它的用户授予权限,例如

grant read, write on directory myimages to jtruant;

[编辑:这是一个工作示例]

这是我的目录:

SQL> select directory_name from all_directories;

DIRECTORY_NAME
------------------------------
EXT_DIR

创建表:

SQL> create table job_resumes2
  2    (resume_id       number,
  3     first_name      varchar2(25),
  4     last_name       varchar2(25),
  5     profile_picture blob);

Table created.

运行程序:

SQL> declare
  2    src_lob  bfile := bfilename('EXT_DIR', 'robco.jpg');
  3    dest_lob blob;
  4  begin
  5    insert into job_resumes2
  6      (resume_id, first_name, last_name, profile_picture)
  7    values
  8      (1, 'John', 'M', empty_blob())
  9      returning profile_picture into dest_lob;
 10
 11    dbms_lob.open(src_lob, dbms_lob.lob_readonly);
 12    dbms_lob.loadfromfile( dest_lob => dest_lob,
 13                           src_lob  => src_lob,
 14                           amount   => dbms_lob.getlength(src_lob) );
 15    dbms_lob.close(src_lob);
 16
 17    commit;
 18  end;
 19  /

PL/SQL procedure successfully completed.

有什么吗?

SQL> select dbms_lob.getlength(profile_picture) from job_resumes2;

DBMS_LOB.GETLENGTH(PROFILE_PICTURE)
-----------------------------------
                               6427

SQL>

似乎还可以。试着按照我的步骤,看看会发生什么。


推荐阅读