我正在尝试将图像存储在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存在。 有什么问题,我该怎么解决?
答案 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>
似乎还可以。尝试按照我的步骤操作,看看会发生什么。