无法将BLOB数据插入表中

时间:2018-08-09 19:14:03

标签: sql oracle12c

我正在尝试将图像存储在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存在。 有什么问题,我该怎么解决?

1 个答案:

答案 0 :(得分:1)

数据库安装在哪里?它在您的计算机上吗?因为目录必须驻留在数据库服务器上(或者可以访问-如果在其他位置,请使用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>

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