Oracle的UTL_FILE.FOPEN的用法

來源:互聯網
上載者:User
racle提供的檔案操作包UTL_FILE包中的UTL_FILE.FOPEN負責開啟一個檔案。

UTL_FILE.FOPEN(location in varchar2, filename in varchar2, open_mode in varchar2) return FILE_TYPE;

Location 是路徑參數,

FILENAME 是檔案名稱,

OPEN_MODE是開啟模式,'R'是讀文本,'W'是寫文本,'A'是附加文本,參數不分大小寫,如果指定'A'但是檔案不存在,它會用'W'先建立出來,'W'有覆蓋的功能;

其中的location並不能簡單的指定為'D:/temp'等路徑,要建立一個DIRECTORY變數並付給許可權(必須以DBA身份登入):


Sql代碼

  1. create
     
    or
     
    replace
     directory D_OUTPUT 
    as
     
    'D:/TEMP'
    ;  
  2. grant
     
    read
    ,write 
    on
     directory D_OUTPUT 
    to
     testdb;  
  3. GRANT
     
    EXECUTE
     
    ON
     utl_file 
    TO
     testdb;  
create or replace directory D_OUTPUT as 'D:/TEMP';grant read,write on directory D_OUTPUT to testdb;GRANT EXECUTE ON utl_file TO testdb;

之後就可以用UTL_FILE包建立檔案了

Sql代碼
  1. V_FILE UTL_FILE.FILE_TYPE;  
  2. V_FILE := UTL_FILE.FOPEN('D_OUTPUT'

    'Data.txt'

    'w'
    );  
V_FILE UTL_FILE.FILE_TYPE;V_FILE := UTL_FILE.FOPEN('D_OUTPUT', 'Data.txt', 'w');

就可以在資料庫伺服器的D:/TEMP建立Data.txt

 

 

 

 

 

 

 

 

最近用到了Oracle的包UTL_FILE,網上卻沒找到關於它的函數,過程使用說明,雖然都不是很難的東西,但簡單列出來,也能提高些效率。
於是有了這篇文。
以下翻譯來自《Oracle Built-in Packages》的第六章,只翻譯了部分,想瞭解的更詳細,請參考原文。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;

參數
 
location
 檔案地址
 
filename
 檔案名稱
 
openmode
 開啟檔案的模式(參見下面說明)
 
max_linesize
檔案每行最大的字元數,包括分行符號。最小為1,最大為32767
 
3種檔案開啟模式:
R 唯讀模式。一般配合UTL_FILE的GET_LINE來讀檔案。
W 寫(替換)模式。檔案的所有行會被刪除。PUT, PUT_LINE, NEW_LINE, PUTF和FFLUSH都可使用
A 寫(附加)模式。原檔案的所有行會被保留。在最末尾行附加新行。PUT, PUT_LINE, NEW_LINE, PUTF和FFLUSH都可使用

開啟檔案時注意以下幾點:
檔案路徑和檔案名稱合起來必須表示作業系統中一個合法的檔案。
檔案路徑必須存在並可訪問;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只提供一個方法去讀取資料:GET_LINE

UTL_FILE.GET_LINE
用法
讀取指定檔案的一行到提供的緩衝。
PROCEDURE UTL_FILE.GET_LINE
   (file IN UTL_FILE.FILE_TYPE,
    buffer OUT VARCHAR2);

file
由FOPEN返回的檔案控制代碼
 
buffer
 讀取的一行資料的存放緩衝

buffer必須足夠大。否則,會拋出VALUE_ERROR 異常。行終止符不會被傳進buffer。

異常
NO_DATA_FOUND
VALUE_ERROR
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.READ_ERROR

 
UTL_FILE.PUT
用法
在當前行輸出資料
PROCEDURE UTL_FILE.PUT
    (file IN UTL_FILE.FILE_TYPE,
    buffer OUT VARCHAR2);
file
由FOPEN返回的檔案控制代碼
buffer
包含要寫入檔案的資料緩衝;Oracle8.0.3及以上最大允許32kB,早期版本只有1023B

UTL_FILE.PUT輸出資料時不會附加行終止符。

UTL_FILE.PUT會產生以下異常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR

UTL_FILE.NEW_LINE

在當前位置輸出新行或行終止符,必須使用NEW_LINE來結束當前行,或者使用PUT_LINE輸出帶有行終止符的完整行資料。

PROCEDURE UTL_FILE.NEW_LINE
   (file IN UTL_FILE.FILE_TYPE,
    lines IN NATURAL := 1);
file
由FOPEN返回的檔案控制代碼
lines
要插入的行數

如果不指定lines參數,NEW_LINE會使用預設值1,在當前行尾換行。如果要插入一個空白行,可以使用以下語句:
UTL_FILE.NEW_LINE (my_file, 2);
如果lines參數為0或負數,什麼都不會寫入檔案。

NEW_LINE會產生以下異常
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

輸出一個字串以及一個與系統有關的行終止符
PROCEDURE UTL_FILE.PUT_LINE
    (file IN UTL_FILE.FILE_TYPE,
    buffer IN VARCHAR2);
file
由FOPEN返回的檔案控制代碼
buffer
包含要寫入檔案的資料緩衝;Oracle8.0.3及以上最大允許32kB,早期版本只有1023B
在調用UTL_FILE.PUT_LINE前,必須先開啟檔案。
UTL_FILE.PUT_LINE會產生以下異常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR

例子
這裡利用UTL_FILE.PUT_LINE從表emp讀取資料到檔案:
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相當於PUT後加上NEW_LINE;也相當於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個參數,最多5個

格式串可使用以下樣式
%s
在格式串中可以使用最多5個%s,與後面的5個參數一一對應
/n
分行符號。在格式串中沒有個數限制
%s會被後面的參數依次填充,如果沒有足夠的參數,%s會被忽視,不被寫入檔案

UTL_FILE.PUTF會產生以下異常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR

UTL_FILE.FFLUSH

確保所有資料寫入檔案。
PROCEDURE UTL_FILE.FFLUSH (file IN UTL_FILE.FILE_TYPE);
file
由FOPEN返回的檔案控制代碼

作業系統可能會快取資料來提高效能。因此可能調用put後,開啟檔案卻看不到寫入的資料。在關閉檔案前要讀取資料的話可以使用UTL_FILE.FFLUSH。
典型的使用方法包括分析執行進度和調試紀錄。
UTL_FILE.FFLUSH會產生以下異常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR

UTL_FILE.FCLOSE

關閉檔案
PROCEDURE UTL_FILE.FCLOSE (file IN OUT FILE_TYPE);
file
由FOPEN返回的檔案控制代碼

注意file是一個IN OUT參數,因為在關閉檔案後會設定為NULL
當試圖關閉檔案時有快取資料未寫入檔案,會拋出WRITE_ERROR異常

UTL_FILE.FCLOSE會產生以下異常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.WRITE_ERROR

UTL_FILE.FCLOSE_ALL

關閉所有已開啟的檔案
PROCEDURE UTL_FILE.FCLOSE_ALL;

在結束程式時要確保所有開啟的檔案已關閉,可使用FCLOSE_ALL
也可以在EXCEPTION使用,當異常退出時,檔案也會被關閉。
EXCEPTION
   WHEN OTHERS
  
THEN
      UTL_FILE.FCLOSE_ALL;
      ... other clean up activities ...
END;

注意:當使用FCLOSE_ALL關閉所有檔案時,檔案控制代碼並不會標記為NULL,使用IS_OPEN會返回TRUE。但是,那些關閉的檔案不能執行讀寫操作(除非你再次開啟檔案)。
UTL_FILE.FCLOSE_ALL會產生以下異常
UTL_FILE.WRITE_ERROR

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.