使用Oracle中fileopen命令加载文件时遇到的怪问题

     打算把一个磁盘上的小图片存到oracle的BLOB字段中,很常见吧,但对我来说是第一次。

     上网找了几个例子,其中有园子里surprise的blog,我ctrl+c/v了上面的例子,如下:

在Oracle中写存储过程
 1 None.gif create   or   replace   procedure  update_student_clob (
 2 None.gif              id  in   number ,
 3 None.gif               file_name   in   varchar2 )
 4 None.gif        is  
 5 None.gif              b_lob  BLOB;
 6 None.gif              f_lob   BFILE;
 7 None.gif        BEGIN
 8 None.gif               -- 首先把SPHOTO数据插入空值
 9 None.gif                Update  student  set  SPHOTO = empty_blob()  where  STUDENTID = id;
10 None.gif               -- 通过SELECT命令查询得到先前插入的记录并锁定
11 None.gif                SELECT  SPHOTO  INTO  b_lob  from  student  where  STUDENTID = id  for   update ;
12 None.gif               -- 读取图片文件对象
13 None.gif               f_lob: = bfilename( ' bb_images ' file_name );
14 None.gif               -- 打开图片文件对象
15 None.gif               dbms_lob.fileopen(f_lob,dbms_lob.file_readonly);
16 None.gif               -- 把图片文件对象写入Blob数据中
17 None.gif               dbms_lob.loadfromfile(b_lob,f_lob,dbms_lob.getlength(f_lob));
18 None.gif              dbms_lob.fileclose(f_lob);
19 None.gif
20 None.gif        END ;

其中:id代表关键字段id,file_name代表文件名 

       bb_images代表目录对象,目录对象创建如下

       create directory bb_images as 'd:\kk';

     我把这段存储过程改编成下面的PL/SQL段:

 1 None.gif create   or   replace  directory bb_images  as   ' d:\images ' ;
 2 None.gif declare
 3 None.gif  b_lob  BLOB;
 4 None.gif  f_lob  BFILE : =  BFILENAME( ' bb_images ' , ' 1.bmp ' );
 5 None.gif BEGIN
 6 None.gif   Update  IMAGETABLE  set  IMAGECOL = empty_blob()  where  IMGID = 1 ;
 7 None.gif   -- 通过SELECT命令查询得到先前插入的记录并锁定
 8 None.gif    SELECT  IMAGECOL  INTO  b_lob  from  IMAGETABLE  where  IMGID = 1   for   update ;
 9 None.gif   -- 打开图片文件对象
10 None.gif   dbms_lob.fileopen(f_lob, dbms_lob.file_readonly);
11 None.gif   -- 把图片文件对象写入Blob数据中
12 None.gif   dbms_lob.loadfromfile(b_lob, f_lob, dbms_lob.getlength(f_lob));
13 None.gif  dbms_lob.fileclose(f_lob);
14 None.gif END ;


     结果正如大家所预料的:失败。报错如下:

declare
*
ERROR 位于第 1 行:
ORA-22285: 对不存在的目录或文件进行FILEOPEN操作
ORA-06512: 在"SYS.DBMS_LOB", line 504
ORA-06512: 在line 10

     这个错误,就像编程中其它编译器经常报告大部分错误一样毫无道理,我给的目录和文件当然是存在的。那么问题到底出在哪呢?
     上网找了一下,google上找到了类似的问题,但没有权威的回答,csdn上也是一样,问的就很少,答的更是没有。
     但是我找到了一个号称是可以运行的相同功能PL/SQL段:

None.gif -- ------------ORACLE 保存图片
None.gif
grant   create   any  directory  to  scott;
None.gif
grant   create   any  library  to  scott;
None.gif
create   or   replace  directory utllobdir  as   ' d:\oracle ' ;
None.gif
create   table  bfile_tab (bfile_column BFILE);
None.gif
create   table  utl_lob_test (blob_column BLOB);
None.gif
None.gif
set  serveroutput  on
None.gif
None.gif
-- 然后执行下面语句
None.gif--
就将d:\oracle目录下的Azul.jpg存入到
None.gif--
utl_lob_test表中的blob_column字段中了。
None.gif

None.gif
declare
None.gif   a_blob  BLOB;
None.gif   a_bfile BFILE :
=  BFILENAME( ' UTLLOBDIR ' , ' Azul.jpg ' );
None.gif
begin
None.gif   
insert   into  bfile_tab  values  (a_bfile)
None.gif     returning bfile_column 
into  a_bfile;
None.gif   
insert   into  utl_lob_test  values  (empty_blob())
None.gif     returning blob_column 
into  a_blob;
None.gif   dbms_lob.fileopen(a_bfile);
None.gif   dbms_lob.loadfromfile(a_blob, a_bfile, dbms_lob.getlength(a_bfile));
None.gif   dbms_lob.fileclose(a_bfile);
None.gif   
commit ;
None.gif
end ;

     这段代码来自csdn,3186489号帖子一位叫freddy2003的回复。令我感到以外又兴奋的是这段代码可以执行成功!多好的代码呀,可是帖主居然就一分都没给freddy2003emsad.gif,没错,csdn中的有些发帖者就是这么怪异:-$

     这样我就开始解剖freddy2003的这段代码,缩减、改编到最后变成:

 1 None.gif create   or   replace  directory utllobdir  as   ' d:\images ' ;
 2 None.gif declare
 3 None.gif   a_blob  BLOB;
 4 None.gif   a_bfile BFILE : =  BFILENAME( ' UTLLOBDIR ' , ' 1.bmp ' );
 5 None.gif begin
 6 None.gif    insert   into  bfile_tab  values  (a_bfile)
 7 None.gif     returning bfile_column  into  a_bfile;
 8 None.gif    insert   into  utl_lob_test  values  (empty_blob())
 9 None.gif     returning blob_column  into  a_blob;
10 None.gif   dbms_lob.fileopen(a_bfile);
11 None.gif   dbms_lob.loadfromfile(a_blob, a_bfile, dbms_lob.getlength(a_bfile));
12 None.gif   dbms_lob.fileclose(a_bfile);
13 None.gif    commit ;
14 None.gif end ;


     点下执行,居然还是成功!

     再下来的修改就一针刺中要害了:我把第4行中的UTLLOBDIR改成utllobdir,再执行,结果立即变成那个原始的无理由的错误:对不存在的目录或文件进行FILEOPEN操作。

     接下来尝试了将create directory语句中的目录对象名改成大写,没问题。但就是只要在bfilename中使用目录对象的时候如果不用大写就一定会出错。这就怪了,Oracle里PL/SQL语句不是大小写不敏感的么?各位看官能不能帮小弟解释一下这个现象?我也无法认定这到底是Oracle中PL/SQL的一个bug还是一个我不知道的规则。

转载于:https://www.cnblogs.com/rib06/archive/2005/09/06/231000.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值