最近用到了Oracle的包UTL_FILE,網(wǎng)上卻沒找到關(guān)于它的函數(shù),過程使用說明,雖然都不是很難的東西,但簡單列出來,也能提高些效率。
于是有了這篇文。
以下翻譯來自《Oracle Built-in Packages》的第六章,只翻譯了部分,想了解的更詳細(xì),請參考原文。http://www.oreilly.com/catalog/oraclebip/chapter/ch06.html
FOPEN
IS_OPEN
GET_LINE
PUT
NEW_LINE
PUT_LINE
PUTF?
FFLUSH?
FCLOSE
FCLOSE_ALL?
?
UTL_FILE.FOPEN 用法
FOPEN會打開指定文件并返回一個文件句柄用于操作文件。
所有PL/SQL版本:???????????????? Oracle 8.0版及以上:
?FUNCTION UTL_FILE.FOPEN (????? FUNCTION UTL_FILE.FOPEN (
??? location???? IN VARCHAR2,????? location???? IN VARCHAR2,
??? filename???? IN VARCHAR2,????? filename???? IN VARCHAR2,
??? open_mode??? IN VARCHAR2)????? open_mode??? IN VARCHAR2,
?RETURN file_type;???????????????? max_linesize IN BINARY_INTEGER)
??????????????????????????????? RETURN file_type;
參數(shù)
?
location
?文件地址
?
filename
?文件名
?
openmode
?打開文件的模式(參見下面說明)
?
max_linesize
文件每行最大的字符數(shù),包括換行符。最小為1,最大為32767
?
3種文件打開模式:
R 只讀模式。一般配合UTL_FILE的GET_LINE來讀文件。
W 寫(替換)模式。文件的所有行會被刪除。PUT, PUT_LINE, NEW_LINE, PUTF和FFLUSH都可使用
A 寫(附加)模式。原文件的所有行會被保留。在最末尾行附加新行。PUT, PUT_LINE, NEW_LINE, PUTF和FFLUSH都可使用
打開文件時注意以下幾點:
文件路徑和文件名合起來必須表示操作系統(tǒng)中一個合法的文件。
文件路徑必須存在并可訪問;FOPEN并不會新建一個文件夾。
如果你想打開文件進行讀操作,文件必須存在;如果你想打開文件進行寫操作,文件不存在時,會新建一個文件。
如果你想打開文件進行附加操作,文件必須存在。A模式不同于W模式。文件不存在時,會拋出INVALID_OPERATION異常。
FOPEN 會拋出以下異常
UTL_FILE.INVALID_MODE
UTL_FILE.INVALID_OPERATION
UTL_FILE.INVALID_PATH
UTL_FILE.INVALID_MAXLINESIZE
UTL_FILE.IS_OPEN用法
如果文件句柄指定的文件已打開,返回TRUE,否則FALSE
FUNCTION UTL_FILE.IS_OPEN (file IN UTL_FILE.FILE_TYPE) RETURN BOOLEAN;
UTL_FILE只提供一個方法去讀取數(shù)據(jù):GET_LINE
UTL_FILE.GET_LINE用法
讀取指定文件的一行到提供的緩存。
PROCEDURE UTL_FILE.GET_LINE
?? (file IN UTL_FILE.FILE_TYPE,
??? buffer OUT VARCHAR2);
file
由FOPEN返回的文件句柄
?
buffer
?讀取的一行數(shù)據(jù)的存放緩存
buffer必須足夠大。否則,會拋出VALUE_ERROR 異常。行終止符不會被傳進buffer。
異常
NO_DATA_FOUND
VALUE_ERROR
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.READ_ERROR
?
UTL_FILE.PUT用法
在當(dāng)前行輸出數(shù)據(jù)
PROCEDURE UTL_FILE.PUT
??? (file IN UTL_FILE.FILE_TYPE,
??? buffer OUT VARCHAR2);
file
由FOPEN返回的文件句柄
buffer
包含要寫入文件的數(shù)據(jù)緩存;Oracle8.0.3及以上最大允許32kB,早期版本只有1023B
UTL_FILE.PUT輸出數(shù)據(jù)時不會附加行終止符。
UTL_FILE.PUT會產(chǎn)生以下異常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR
UTL_FILE.NEW_LINE
在當(dāng)前位置輸出新行或行終止符,必須使用NEW_LINE來結(jié)束當(dāng)前行,或者使用PUT_LINE輸出帶有行終止符的完整行數(shù)據(jù)。
PROCEDURE UTL_FILE.NEW_LINE
?? (file IN UTL_FILE.FILE_TYPE,
??? lines IN NATURAL := 1);
file
由FOPEN返回的文件句柄
lines
要插入的行數(shù)
如果不指定lines參數(shù),NEW_LINE會使用默認(rèn)值1,在當(dāng)前行尾換行。如果要插入一個空白行,可以使用以下語句:
UTL_FILE.NEW_LINE (my_file, 2);
如果lines參數(shù)為0或負(fù)數(shù),什么都不會寫入文件。
NEW_LINE會產(chǎn)生以下異常
VALUE_ERROR
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR
例子
如果要在UTL_FILE.PUT后立刻換行,可以如下例所示:
PROCEDURE add_line (file_in IN UTL_FILE.FILE_TYPE, line_in IN VARCHAR2)
IS
BEGIN
?? UTL_FILE.PUT (file_in, line_in);
?? UTL_FILE.NEW_LINE (file_in);
END;
UTL_FILE.PUT_LINE
輸出一個字符串以及一個與系統(tǒng)有關(guān)的行終止符
PROCEDURE UTL_FILE.PUT_LINE
??? (file IN UTL_FILE.FILE_TYPE,
??? buffer IN VARCHAR2);
file
由FOPEN返回的文件句柄
buffer
包含要寫入文件的數(shù)據(jù)緩存;Oracle8.0.3及以上最大允許32kB,早期版本只有1023B
在調(diào)用UTL_FILE.PUT_LINE前,必須先打開文件。
UTL_FILE.PUT_LINE會產(chǎn)生以下異常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR
例子
這里利用UTL_FILE.PUT_LINE從表emp讀取數(shù)據(jù)到文件:
PROCEDURE emp2file
IS
?? fileID UTL_FILE.FILE_TYPE;
BEGIN
?? fileID := UTL_FILE.FOPEN ('/tmp', 'emp.dat', 'W');
?
?? /* Quick and dirty construction here! */
?? FOR emprec IN (SELECT * FROM emp)
?? LOOP
????? UTL_FILE.PUT_LINE
???????? (TO_CHAR (emprec.empno) || ',' ||
????????? emprec.ename || ',' ||
????????? ...
????????? TO_CHAR (emprec.deptno));
?? END LOOP;
?
?? UTL_FILE.FCLOSE (fileID);
END;
PUT_LINE相當(dāng)于PUT后加上NEW_LINE;也相當(dāng)于PUTF的格式串"%s\n"。
UTL_FILE.PUTF
以一個模版樣式輸出至多5個字符串,類似C中的printf
PROCEDURE UTL_FILE.PUTF
??? (file IN FILE_TYPE
??? ,format IN VARCHAR2
??? ,arg1 IN VARCHAR2 DEFAULT NULL
??? ,arg2 IN VARCHAR2 DEFAULT NULL
??? ,arg3 IN VARCHAR2 DEFAULT NULL
??? ,arg4 IN VARCHAR2 DEFAULT NULL
??? ,arg5 IN VARCHAR2 DEFAULT NULL);
file
由FOPEN返回的文件句柄
format
決定格式的格式串
argN
可選的5個參數(shù),最多5個
格式串可使用以下樣式
%s
在格式串中可以使用最多5個%s,與后面的5個參數(shù)一一對應(yīng)
\n
換行符。在格式串中沒有個數(shù)限制
%s會被后面的參數(shù)依次填充,如果沒有足夠的參數(shù),%s會被忽視,不被寫入文件
UTL_FILE.PUTF會產(chǎn)生以下異常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR
UTL_FILE.FFLUSH
確保所有數(shù)據(jù)寫入文件。
PROCEDURE UTL_FILE.FFLUSH (file IN UTL_FILE.FILE_TYPE);
file
由FOPEN返回的文件句柄
操作系統(tǒng)可能會緩存數(shù)據(jù)來提高性能。因此可能調(diào)用put后,打開文件卻看不到寫入的數(shù)據(jù)。在關(guān)閉文件前要讀取數(shù)據(jù)的話可以使用UTL_FILE.FFLUSH。
典型的使用方法包括分析執(zhí)行進度和調(diào)試紀(jì)錄。
UTL_FILE.FFLUSH會產(chǎn)生以下異常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR
UTL_FILE.FCLOSE
關(guān)閉文件
PROCEDURE UTL_FILE.FCLOSE (file IN OUT FILE_TYPE);
file
由FOPEN返回的文件句柄
注意file是一個IN OUT參數(shù),因為在關(guān)閉文件后會設(shè)置為NULL
當(dāng)試圖關(guān)閉文件時有緩存數(shù)據(jù)未寫入文件,會拋出WRITE_ERROR異常
UTL_FILE.FCLOSE會產(chǎn)生以下異常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.WRITE_ERROR
UTL_FILE.FCLOSE_ALL
關(guān)閉所有已打開的文件
PROCEDURE UTL_FILE.FCLOSE_ALL;
在結(jié)束程序時要確保所有打開的文件已關(guān)閉,可使用FCLOSE_ALL
也可以在EXCEPTION使用,當(dāng)異常退出時,文件也會被關(guān)閉。
EXCEPTION
?? WHEN OTHERS
??
THEN
????? UTL_FILE.FCLOSE_ALL;
????? ... other clean up activities ...
END;
注意:當(dāng)使用FCLOSE_ALL關(guān)閉所有文件時,文件句柄并不會標(biāo)記為NULL,使用IS_OPEN會返回TRUE。但是,那些關(guān)閉的文件不能執(zhí)行讀寫操作(除非你再次打開文件)。
UTL_FILE.FCLOSE_ALL會產(chǎn)生以下異常
UTL_FILE.WRITE_ERROR