Oracle PL/SQL error:ORA-22285: non-existent directory or file for FILEOPEN operation
这里将要描述的错误如题所示,该错误发生在使用“DBMS_LOB”PL/SQL包的时候。
具体报错信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
SQL> declare 2 l_bfile bfile; 3 l_blob blob; 4 begin 5 insert into scott.pic_data values (1,'Wen Ting',empty_blob(),bfilename('pic_location','lwt.jpg')) 6 return p_data into l_blob; 7 l_bfile := bfilename('pic_location','lwt.jpg'); 8 dbms_lob.open(l_bfile,dbms_lob.file_readonly); 9 dbms_lob.loadfromfile(l_blob,l_bfile,dbms_lob.getlength(l_bfile)); 10 dbms_lob.close(l_bfile); 11 commit; 12 end; 13 / declare * ERROR at line 1: ORA-22285: non-existent directory or file for FILEOPEN operation ORA-06512: at "SYS.DBMS_LOB", line 716 ORA-06512: at line 8 SQL> |
该报错显示:目录不存在。
事实上上述PL/SQL中引用的目录对象:pic_location,是存在的。
1 2 3 4 5 6 7 8 9 |
SQL> col object_name for a12 SQL> run 1* select owner,object_name,object_type from dba_objects where object_name='PIC_LOCATION' OWNER OBJECT_NAME OBJECT_TYPE ------------------------------ ------------ ------------------- SYS PIC_LOCATION DIRECTORY SQL> |
事实上,引起该错误的原因是PL/SQL中DBMS_LOB引用目录对象时,对象名大小写敏感。
你需要将它们都设置为大写。
否则将会遇到文首处的错误。
将目录对象的名称修改为大写后,PL/SQL执行成功:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
SQL> declare 2 l_bfile bfile; 3 l_blob blob; 4 begin 5 insert into scott.pic_data values (1,'Wen Ting',empty_blob(),bfilename('pic_location','lwt.jpg')) 6 return p_data into l_blob; 7 l_bfile := bfilename('PIC_LOCATION','lwt.jpg'); 8 dbms_lob.open(l_bfile,dbms_lob.file_readonly); 9 dbms_lob.loadfromfile(l_blob,l_bfile,dbms_lob.getlength(l_bfile)); 10 dbms_lob.close(l_bfile); 11 commit; 12 end; 13 / PL/SQL procedure successfully completed. SQL> |
————————————————————
Ending。