使用Oracle中fileopen命令加载文件时遇到的怪问题(转)
生活随笔
收集整理的這篇文章主要介紹了
使用Oracle中fileopen命令加载文件时遇到的怪问题(转)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
打算把一個磁盤上的小圖片存到oracle的BLOB字段中,很常見吧,但對我來說是第一次。
?????上網找了幾個例子,其中有園子里surprise的blog,我ctrl+c/v了上面的例子,如下:
在Oracle中寫存儲過程
?1create?or?replace?procedure?update_student_clob?(
?2??????????????id?in?number,
?3??????????????file_name?in?varchar2)
?4???????is?
?5??????????????b_lob??BLOB;
?6??????????????f_lob???BFILE;
?7???????BEGIN
?8??????????????--首先把SPHOTO數據插入空值
?9??????????????Update?student?set?SPHOTO=empty_blob()?where?STUDENTID=id;
10??????????????--通過SELECT命令查詢得到先前插入的記錄并鎖定
11??????????????SELECT?SPHOTO?INTO?b_lob?from?student?where?STUDENTID=id?for?update;
12??????????????--讀取圖片文件對象
13??????????????f_lob:=bfilename('bb_images',?file_name);
14??????????????--打開圖片文件對象
15??????????????dbms_lob.fileopen(f_lob,dbms_lob.file_readonly);
16??????????????--把圖片文件對象寫入Blob數據中
17??????????????dbms_lob.loadfromfile(b_lob,f_lob,dbms_lob.getlength(f_lob));
18??????????????dbms_lob.fileclose(f_lob);
19
20???????END;
其中:id代表關鍵字段id,file_name代表文件名?
???????bb_images代表目錄對象,目錄對象創建如下
???????create?directory?bb_images?as?'d:\kk';
?????我把這段存儲過程改編成下面的PL/SQL段:
?1create?or?replace?directory?bb_images?as?'d:\images';
?2declare
?3??b_lob??BLOB;
?4??f_lob??BFILE?:=?BFILENAME('bb_images','1.bmp');
?5BEGIN
?6??Update?IMAGETABLE?set?IMAGECOL=empty_blob()?where?IMGID=1;
?7??--通過SELECT命令查詢得到先前插入的記錄并鎖定
?8??SELECT?IMAGECOL?INTO?b_lob?from?IMAGETABLE?where?IMGID=1?for?update;
?9??--打開圖片文件對象
10??dbms_lob.fileopen(f_lob,?dbms_lob.file_readonly);
11??--把圖片文件對象寫入Blob數據中
12??dbms_lob.loadfromfile(b_lob,?f_lob,?dbms_lob.getlength(f_lob));
13??dbms_lob.fileclose(f_lob);
14END;
?????結果正如大家所預料的:失敗。報錯如下:
declare
*
ERROR?位于第?1?行:
ORA-22285:?對不存在的目錄或文件進行FILEOPEN操作
ORA-06512:?在"SYS.DBMS_LOB",?line?504
ORA-06512:?在line?10
?????這個錯誤,就像編程中其它編譯器經常報告大部分錯誤一樣毫無道理,我給的目錄和文件當然是存在的。那么問題到底出在哪呢?
?????上網找了一下,google上找到了類似的問題,但沒有權威的回答,csdn上也是一樣,問的就很少,答的更是沒有。
?????但是我找到了一個號稱是可以運行的相同功能PL/SQL段:
--------------ORACLE?保存圖片
grant?create?any?directory?to?scott;
grant?create?any?library?to?scott;
create?or?replace?directory?utllobdir?as?'d:\oracle';
create?table?bfile_tab?(bfile_column?BFILE);
create?table?utl_lob_test?(blob_column?BLOB);
set?serveroutput?on
--然后執行下面語句
--就將d:\oracle目錄下的Azul.jpg存入到
--utl_lob_test表中的blob_column字段中了。
declare
???a_blob??BLOB;
???a_bfile?BFILE?:=?BFILENAME('UTLLOBDIR','Azul.jpg');
begin
???insert?into?bfile_tab?values?(a_bfile)
?????returning?bfile_column?into?a_bfile;
???insert?into?utl_lob_test?values?(empty_blob())
?????returning?blob_column?into?a_blob;
???dbms_lob.fileopen(a_bfile);
???dbms_lob.loadfromfile(a_blob,?a_bfile,?dbms_lob.getlength(a_bfile));
???dbms_lob.fileclose(a_bfile);
???commit;
end;
?????這段代碼來自csdn,3186489號帖子一位叫freddy2003的回復。令我感到以外又興奮的是這段代碼可以執行成功!多好的代碼呀,可是帖主居然就一分都沒給freddy2003,沒錯,csdn中的有些發帖者就是這么怪異:-$
?????這樣我就開始解剖freddy2003的這段代碼,縮減、改編到最后變成:
?1create?or?replace?directory?utllobdir?as?'d:\images';
?2declare
?3???a_blob??BLOB;
?4???a_bfile?BFILE?:=?BFILENAME('UTLLOBDIR','1.bmp');
?5begin
?6???insert?into?bfile_tab?values?(a_bfile)
?7?????returning?bfile_column?into?a_bfile;
?8???insert?into?utl_lob_test?values?(empty_blob())
?9?????returning?blob_column?into?a_blob;
10???dbms_lob.fileopen(a_bfile);
11???dbms_lob.loadfromfile(a_blob,?a_bfile,?dbms_lob.getlength(a_bfile));
12???dbms_lob.fileclose(a_bfile);
13???commit;
14end;
?????點下執行,居然還是成功!
?????再下來的修改就一針刺中要害了:我把第4行中的UTLLOBDIR改成utllobdir,再執行,結果立即變成那個原始的無理由的錯誤:對不存在的目錄或文件進行FILEOPEN操作。
?????接下來嘗試了將create?directory語句中的目錄對象名改成大寫,沒問題。但就是只要在bfilename中使用目錄對象的時候如果不用大寫就一定會出錯。這就怪了,Oracle里PL/SQL語句不是大小寫不敏感的么?各位看官能不能幫小弟解釋一下這個現象?我也無法認定這到底是Oracle中PL/SQL的一個bug還是一個我不知道的規則。
?????上網找了幾個例子,其中有園子里surprise的blog,我ctrl+c/v了上面的例子,如下:
在Oracle中寫存儲過程
?1create?or?replace?procedure?update_student_clob?(
?2??????????????id?in?number,
?3??????????????file_name?in?varchar2)
?4???????is?
?5??????????????b_lob??BLOB;
?6??????????????f_lob???BFILE;
?7???????BEGIN
?8??????????????--首先把SPHOTO數據插入空值
?9??????????????Update?student?set?SPHOTO=empty_blob()?where?STUDENTID=id;
10??????????????--通過SELECT命令查詢得到先前插入的記錄并鎖定
11??????????????SELECT?SPHOTO?INTO?b_lob?from?student?where?STUDENTID=id?for?update;
12??????????????--讀取圖片文件對象
13??????????????f_lob:=bfilename('bb_images',?file_name);
14??????????????--打開圖片文件對象
15??????????????dbms_lob.fileopen(f_lob,dbms_lob.file_readonly);
16??????????????--把圖片文件對象寫入Blob數據中
17??????????????dbms_lob.loadfromfile(b_lob,f_lob,dbms_lob.getlength(f_lob));
18??????????????dbms_lob.fileclose(f_lob);
19
20???????END;
其中:id代表關鍵字段id,file_name代表文件名?
???????bb_images代表目錄對象,目錄對象創建如下
???????create?directory?bb_images?as?'d:\kk';
?????我把這段存儲過程改編成下面的PL/SQL段:
?1create?or?replace?directory?bb_images?as?'d:\images';
?2declare
?3??b_lob??BLOB;
?4??f_lob??BFILE?:=?BFILENAME('bb_images','1.bmp');
?5BEGIN
?6??Update?IMAGETABLE?set?IMAGECOL=empty_blob()?where?IMGID=1;
?7??--通過SELECT命令查詢得到先前插入的記錄并鎖定
?8??SELECT?IMAGECOL?INTO?b_lob?from?IMAGETABLE?where?IMGID=1?for?update;
?9??--打開圖片文件對象
10??dbms_lob.fileopen(f_lob,?dbms_lob.file_readonly);
11??--把圖片文件對象寫入Blob數據中
12??dbms_lob.loadfromfile(b_lob,?f_lob,?dbms_lob.getlength(f_lob));
13??dbms_lob.fileclose(f_lob);
14END;
?????結果正如大家所預料的:失敗。報錯如下:
declare
*
ERROR?位于第?1?行:
ORA-22285:?對不存在的目錄或文件進行FILEOPEN操作
ORA-06512:?在"SYS.DBMS_LOB",?line?504
ORA-06512:?在line?10
?????這個錯誤,就像編程中其它編譯器經常報告大部分錯誤一樣毫無道理,我給的目錄和文件當然是存在的。那么問題到底出在哪呢?
?????上網找了一下,google上找到了類似的問題,但沒有權威的回答,csdn上也是一樣,問的就很少,答的更是沒有。
?????但是我找到了一個號稱是可以運行的相同功能PL/SQL段:
--------------ORACLE?保存圖片
grant?create?any?directory?to?scott;
grant?create?any?library?to?scott;
create?or?replace?directory?utllobdir?as?'d:\oracle';
create?table?bfile_tab?(bfile_column?BFILE);
create?table?utl_lob_test?(blob_column?BLOB);
set?serveroutput?on
--然后執行下面語句
--就將d:\oracle目錄下的Azul.jpg存入到
--utl_lob_test表中的blob_column字段中了。
declare
???a_blob??BLOB;
???a_bfile?BFILE?:=?BFILENAME('UTLLOBDIR','Azul.jpg');
begin
???insert?into?bfile_tab?values?(a_bfile)
?????returning?bfile_column?into?a_bfile;
???insert?into?utl_lob_test?values?(empty_blob())
?????returning?blob_column?into?a_blob;
???dbms_lob.fileopen(a_bfile);
???dbms_lob.loadfromfile(a_blob,?a_bfile,?dbms_lob.getlength(a_bfile));
???dbms_lob.fileclose(a_bfile);
???commit;
end;
?????這段代碼來自csdn,3186489號帖子一位叫freddy2003的回復。令我感到以外又興奮的是這段代碼可以執行成功!多好的代碼呀,可是帖主居然就一分都沒給freddy2003,沒錯,csdn中的有些發帖者就是這么怪異:-$
?????這樣我就開始解剖freddy2003的這段代碼,縮減、改編到最后變成:
?1create?or?replace?directory?utllobdir?as?'d:\images';
?2declare
?3???a_blob??BLOB;
?4???a_bfile?BFILE?:=?BFILENAME('UTLLOBDIR','1.bmp');
?5begin
?6???insert?into?bfile_tab?values?(a_bfile)
?7?????returning?bfile_column?into?a_bfile;
?8???insert?into?utl_lob_test?values?(empty_blob())
?9?????returning?blob_column?into?a_blob;
10???dbms_lob.fileopen(a_bfile);
11???dbms_lob.loadfromfile(a_blob,?a_bfile,?dbms_lob.getlength(a_bfile));
12???dbms_lob.fileclose(a_bfile);
13???commit;
14end;
?????點下執行,居然還是成功!
?????再下來的修改就一針刺中要害了:我把第4行中的UTLLOBDIR改成utllobdir,再執行,結果立即變成那個原始的無理由的錯誤:對不存在的目錄或文件進行FILEOPEN操作。
?????接下來嘗試了將create?directory語句中的目錄對象名改成大寫,沒問題。但就是只要在bfilename中使用目錄對象的時候如果不用大寫就一定會出錯。這就怪了,Oracle里PL/SQL語句不是大小寫不敏感的么?各位看官能不能幫小弟解釋一下這個現象?我也無法認定這到底是Oracle中PL/SQL的一個bug還是一個我不知道的規則。
轉載于:https://www.cnblogs.com/jiangC/archive/2010/10/08/2769152.html
總結
以上是生活随笔為你收集整理的使用Oracle中fileopen命令加载文件时遇到的怪问题(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拼接字符串 新增数据方法
- 下一篇: junit jumpstart