1. 程式人生 > >oracle讀寫檔案--利用utl_file包對磁碟檔案的讀寫操作

oracle讀寫檔案--利用utl_file包對磁碟檔案的讀寫操作

摘要:


使用者提出一個需求,即ORACLE中的一個表儲存了照片資訊,欄位型別為BLOB,要求能匯出成檔案形式. 本想寫個C#程式來做,後來想起ORACLE有很多包,功能很好很強大,於是網上參考了些文章完成了. 主要是用了ORACLE的兩個包:UTL_FILE和DBMS_LOB.

實現過程:


第一步:以管理員使用者登陸設定可操作目錄

--CREATE DIRECTORY privilege is granted only to SYS and SYSTEM by default.createorreplace directory BLOBDIR as'D:\PIC';
grantread,write 
on directory BLOBDIR to sharedb;
GRANTEXECUTEON utl_file TO sharedb;
select*from ALL_DIRECTORIES;

第二步:普通使用者登陸,編寫儲存過程


CREATEORREPLACEPROCEDURE GET_PIC_BLOB (i_xh VARCHAR2IS
l_file UTL_FILE.FILE_TYPE;
l_buffer 
RAW(32767);
l_amount BINARY_INTEGER :
=32767;
l_pos 
INTEGER :=1;
l_blob BLOB;
l_blob_len 
INTEGER
;

BEGINSELECT PIC INTO L_BLOB FROM TB_ZP WHERE PSNNO = i_xh;
 l_blob_len :
= DBMS_LOB.GETLENGTH(l_blob);
 l_file :
= UTL_FILE.FOPEN('BLOBDIR',i_xh ||'.jpg','WB',32767);
 
WHILE l_pos < l_blob_len LOOP
    DBMS_LOB.
READ (l_blob, l_amount, l_pos, l_buffer);
    UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE);
    l_pos :
= l_pos + l_amount;
 
END LOOP;
 UTL_FILE.FCLOSE(l_file);

EXCEPTION
 
 
--WHEN NO_DATA_FOUND THEN--DBMS_OUTPUT.put_line('no data : ' || i_xh);WHEN OTHERS THENIF UTL_FILE.IS_OPEN(l_file) THEN
   UTL_FILE.FCLOSE(l_file);
  RAISE;
  
ENDIF;
END GET_PIC_BLOB;

第三步:編寫PL/SQL 塊,迴圈執行該儲存過程

複製程式碼 declarecursor cur_01 isselect xh from xs_xsjbk where rownum <=5000 ;

beginfor rec_01 in cur_01 loop        
        GET_PIC_BLOB(rec_01.xh);
    
end loop;   
end; 複製程式碼

測試結果.取了5000條資料,其中有照片資訊的為3407條.用時1分12秒,感覺還可以.

總結:

1.由管理員建立可訪問目錄和授權給普通使用者比較重要,一開始沒有注意,總是報非法路徑錯誤,搞了較長時間在這上面.

2.儲存過程中的NO_DATA_FOUND異常本來是屏顯輸出無照片的學號資訊,但是實際執行時出錯,原因是DBMS_OUTPUT.put_line列印條數過多,於是註釋掉了.

3.Oracle本身提供了大量使用的包,如UTL_HTTP,DBMS_OUTPUT等,分別封裝了不同的功能,進行大量的應用程式開發的可能,從而拓展了Oracle的功能.