Oracle - UTL_FILE包之详解
一、說明
 ? ? UTL_FILE是oracle提供的一個標準的工具包,用來讀寫文件使用。
 ? ??
 ? ??
 二、路徑
 ? ? 包UTL_FILE用于讀寫操作系統的文件,前提是首先創建路徑(Directory)并授權。ORACLE目錄的作用就是讓ORACLE數據庫和操作系統之前進行文件的交互。
 ? ? 為了創建目錄,必須具有DBA角色或者賦予了CREATE ANY DIRECTORY權限。如果普通用戶被賦予了CREATE ANY DIRECTORY權限,那么用戶就自動具備目錄的READ和WRITE權限
 
 ? ? 創建:CREATE [OR REPLACE] DIRECTORY directory_name AS 'path_name' ;
create or replace directory DB_OUT as '/usr/local/xilen/DB_OUT';
? ??賦權:GRANT READ[,WRITE] ON DIRECTORY directory_namne TO user_name;
--路徑授權,添加對路徑讀、寫權限 grant read,write on directory DB_OUT to xilen;--utl_file包授權,添加執行權限 GRANT EXECUTE ON utl_file TO xilen;
? ??查看(具有READ和WRITE權限的目錄):
-- 限制單列的顯示長度 COL DIRECTORY_PATH format a60; -- 查詢路徑 SELECT DIRECTORY_NAME, DIRECTORY_PATH, GRANTEE, PRIVILEGE FROM USER_TAB_PRIVS T, ALL_DIRECTORIES D WHERE T.TABLE_NAME(+)=D.DIRECTORY_NAME;
三、詳解
? ? 1、FILE_TYPE
? ? ? ? 該類型是UTL_FILE包中定義的記錄類型,其成員是私有的,不能夠被直接引用。該類型的定義如下:
TYPE file_type IS RECORD(id BINARY_INTEGER,datatype BINARY_INTEGER );
? ? 2、FOPEN
? ? ? ? 該函數用于打開文件。使用這個函數最多可以打開50個文件,語法如下:
UTL_FILE.FOPEN(location IN VARCHAR2, -- 文件路徑(必須要使用DIRECTORY對象,并且其名稱必須為大寫)filename IN VARCHAR2, -- 文件名open_mode IN VARCHAR2, -- 打開模式 max_linesize IN BINARY_INTEGER -- 指定文件每行存放的最大字符數 ) RETURN file_type; -- 預操作文件的指針(句柄) ? ??注:文件的打開模式包含'r', 'w', 'a' 'rb', 'wb', 'ab'六種:
? ? ? ??--'r':讀文件(文本),一定要保證有該文件,不然會報UTL_FILE.INVALID_PATH異常
? ? ? ??--'w':寫文件(文本),沒有該文件的話會自動添加;有的話會覆蓋
? ? ? ??--'a':追加文件(文本),如果文件不存在,則會以write模式創建此文件
? ? ? ??--帶有'b'后綴的為使用byte(字節)模式,BLOB與VARCHAR2不一樣,BLOB打開時一定要用帶有'b'后綴的模式
 
?3、IS_OPEN
 ? ? ? 該函數用于確定文件是否已經被打開,語法如下:
 
DECLAREHANDLE UTL_FILE.FILE_TYPE; BEGINIF NOT UTL_FILE.is_open(HANDLE) THENHANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);END IF;DBMS_OUTPUT.PUT_LINE('D:\DYWT.TXT已經被打開'); END;
? ? 4、FCLOSE
? ? ? ? 該過程用于關閉已經打開的文件,語法如下:
UTL_FILE.FCLOSE(FILE IN OUT FILE_TYPE);
? ? 5、FCLOSE_ALL
? ? ? ? 該過程用于關閉當前打開的所有文件。語法如下:
UTL_FILE.FCLOSE_ALL;
? ? 6、GET_LINE
? ? ? ? 該過程用于從已經打開的文件中讀取行內容,行內容會被讀取到輸出緩沖區。語法如下:
UTL_FILE.GET_LINE(file IN FILE_TYPE, -- 文件句柄buffer OUT VARCHAR2, -- 存儲讀取的Bufflinesize IN NUMBER, -- 讀取的最大字節數len IN PLS_INTEGER DEFAULT NULL -- 實際讀取長度 );? ? ? ? 使用該過程的示例如下:
DECLAREHANDLE UTL_FILE.FILE_TYPE;BUFFER VARCHAR2(100); BEGINIF NOT UTL_FILE.is_open(HANDLE) THENHANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);END IF;UTL_FILE.GET_LINE(HANDLE,BUFFER,100);DBMS_OUTPUT.PUT_LINE(BUFFER);UTL_FILE.fclose(HANDLE); END;
? ? 7、GET_RAW
? ? ? ? 該過程用于從文件中讀取RAW字符串,并調節文件指針到讀取位置。語法如下:
UTL_FILE.GET_RAW(fid IN UTL_FILE.TYPE, -- 文件句柄r OUT NOCOPY RAW, -- 讀取的緩存Bufflen IN PLS_INTEGER DEFAULT NULL -- 讀取長度 );? ? ? ? 上面所示:fid用于指定文件的句柄,r用于取得讀取信息,示例如下:
DECLAREHANDLE UTL_FILE.FILE_TYPE;BUFFER VARCHAR2(2000); BEGINIF NOT UTL_FILE.is_open(HANDLE) THENHANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);END IF;UTL_FILE.GET_RAW(HANDLE,BUFFER,1000);DBMS_OUTPUT.PUT_LINE(BUFFER);UTL_FILE.fclose(HANDLE); END;
? ? 8、PUT
? ? ? ? 該過程用于將緩沖區內容寫入到文件中。當使用PUT過程的時候,文件必須以寫方式打開,在寫入緩沖區之后,如果要結束行,那么可以使用NEW_LINE過程。語法如下:
UTL_FILE.PUT(file IN FILE_TYPE,buffer IN VARCHAR2 ); ? ? ? ? 使用該過程的示例如下: DECLAREHANDLE UTL_FILE.FILE_TYPE;BUFFER VARCHAR2(2000); BEGINIF NOT UTL_FILE.IS_OPEN(HANDLE) THENHANDLE := UTL_FILE.FOPEN('CZW','NEW.TXT','W',1000);END IF;BUFFER:='&CONTENT1';UTL_FILE.PUT(HANDLE,BUFFER);UTL_FILE.NEW_LINE(HANDLE);BUFFER:='&CONTENT2';UTL_FILE.PUT(HANDLE,BUFFER);UTL_FILE.NEW_LINE(HANDLE);UTL_FILE.FCLOSE(HANDLE); END;
? ? 9、PUT_RAW
? ? ? ? 該過程用于將RAW緩沖區中的數據寫入文件中。語法如下:
UTL_FILE.PUT_RAW(fid IN UTL_FILE.FILE_TYPE,R IN RAW,autoflush IN BOOLEAN DEFAULT FALSE );? ? ? ? 上述,fid用于指定文件句柄,r用于指定存放RAW數據的緩沖區,autoflush用于指定是否自動刷新緩沖區數據.該過程的示例如下:
DECLAREHANDLE UTL_FILE.FILE_TYPE;BUFFER VARCHAR2(2000); BEGINIF NOT UTL_FILE.IS_OPEN(HANDLE) THENHANDLE := UTL_FILE.FOPEN('CZW','NEW.TXT','W',1000);END IF;BUFFER:='&CONTENT1'; UTL_FILE.PUT_RAW(HANDLE,BUFFER);UTL_FILE.NEW_LINE(HANDLE);UTL_FILE.FCLOSE(HANDLE); END;
? ? 10、NEW_LINE
? ? ? ? 該過程用于為文件增加行終止符,語法如下:
UTL_FILE.NEW_LINE(file IN FILE_TYPE,lines IN NATURAL :=1 -- 指定在文件中增加的行終止符的個數 );
? ? 11、PUT_LINE
? ? ? ? 該過程用于將文本緩沖區內容寫入到文件中。當使用該過程為文件追加內容時,會自動在文件的尾部追加行終止符。
UTL_FILE.PUT_LINE ( file IN FILE_TYPE,buffer IN VARCHAR2,autoflush IN BOOLEAN DEFAULT FALSE );
? ? 12、FFLUSH ? ? ? ? 該過程用于將數據強制性寫入到文件中,正常情況下,當給文件寫入數據的時候,數據會被暫時的放到緩存中。過程FFLUSH用于強制將數據寫入到文件中。語法如下:
UTL_FILE.FFLUSH(file IN FILE_TYPE):
 
? ? 13、FREMOVE
? ? ? ? 該過程用于刪除磁盤文件。語法如下:UTL_FILE.FREMOVE(location IN VARCHAR2, -- 指定DIRECTORY,注意,這里也必須要大寫filename IN VARCHAR2 -- 指定要刪除的文件名 );
? ? 14、FCOPY
? ? ? ? 該過程用于將源文件的全部或者部分內容復制到目標文件中。當使用該過程的時候,如果不設起始行和結束行,則將復制文件所有的內容。語法如下:
UTL_FILE.FCOPY(location IN VARCHAR2, -- 指定源DIRECTORY路徑對象filename IN VARCHAR2, -- 指定文件名dest_dir IN VARCHAR2, -- 希望復制到的Directory路徑對象dest_file IN VARCHAR2, -- 復制后的文件名start_line IN PLS_INTEGER DEFAULT 1, -- 指定起始行號end_line IN PLS_INTEGER DEFALUT NULL -- 指定結束行號 );
? ? 15、FRENAME
? ? ? ? 該過程用于修改已經存在的文件名字,其作用于UNIX的MV命令完全相同,在修改文件名字的時候,通過指定overwrite參數可以覆蓋已經存在的文件。語法如下:
UTL_FILE.FRENAME(location IN VARCHAR2,filename IN VARCHAR2,dest_dir IN VARCHAR2,dest_file IN VARCHAR2,overwrite IN BOOLEAN DEFAULT FALSE -- 是否覆蓋已經存在的文件 );
四、示例
? ? 導出表數據示例:
DECLAREHANDLE UTL_FILE.FILE_TYPE; BEGINHANDLE := UTL_FILE.FOPEN('CZW_DIR','DEPT.TXT','W',1000);FOR I IN (SELECT T.DEPTNO||','||T.DNAME||','||T.LOC AS MSG FROM SCOTT.DEPT T) LOOPUTL_FILE.PUT_LINE(HANDLE,I.MSG);END LOOP;UTL_FILE.FFLUSH(HANDLE);UTL_FILE.FCLOSE(HANDLE); END;
 
 
五、參考
http://blog.csdn.net/bisal/article/details/24667609
 
http://zhangzhongjie.iteye.com/blog/1903024
http://www.2cto.com/database/201301/181232.html
http://blog.csdn.net/john2522/article/details/8124087
 
 
 
總結
以上是生活随笔為你收集整理的Oracle - UTL_FILE包之详解的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: dell 7559 2548B加装固态硬
 - 下一篇: 大一C语言学习总结