ORACLE之UTL_FILE包詳解


1 Utl_File包簡介
Oracle的UTL_FILE包用來實現對磁盤文件的I/O操作。
(1)Oracle10g之前的版本需要指定utl_file包可以操作的目錄。
      方法:
        1、alter system set utl_file_dir='e:/utl' scope=spfile;
        2、在init.ora文件中,配置如下:UTL_FILE=E:/utl或者UTL_FILE_DIR=E:/utl;
(2)Oracle10g之后的版本,只需要先創建一個路徑即可。
2 Utl_file包的依賴關系
    SELECT name FROM dba_dependencies WHERE referenced_name = 'UTL_FILE'
    UNION
    SELECT referenced_name FROM dba_dependencies WHERE name = 'UTL_FILE';
3 UTL_FILE常用方法
3.1 FOPEN()
英文解釋:(1) Open a file for read operations
FOPEN會打開指定文件並返回一個文件句柄用於操作文件。
utl_file.fopen(
    file_location IN VARCHAR2,  --路徑
    file_name     IN VARCHAR2,   --文件名稱
    open_mode     IN VARCHAR2,   --打開模式 R 讀 W 寫 A 追加
    max_linesize  IN BINARY_INTEGER DEFAULT NULL)
RETURN file_type;
參數
     location    文件地址
     filename    文件名
     openmode    打開文件的模式(參見下面說明)
3種文件打開模式:
    (1) R只讀模式。一般配合UTL_FILE的GET_LINE來讀文件。
    (2) W寫(替換)模式。文件的所有行會被刪除。PUT, PUT_LINE, NEW_LINE, PUTF和FFLUSH都可使用。
    (3) A寫(附加)模式。原文件的所有行會被保留。在最末尾行附加新行。
         PUT, PUT_LINE, NEW_LINE, PUTF和FFLUSH都可使用max_linesize  文件每行最大的字符數,包括換行符。最小為1,最大為32767。
打開文件時注意以下幾點:
   *   文件路徑和文件名合起來必須表示操作系統中一個合法的文件。
   *   文件路徑必須存在並可訪問;FOPEN並不會新建一個文件夾。
   *   如果你想打開文件進行讀操作,文件必須存在;如果你想打開文件進行寫操作,文件不存在時,會新建一個文件。
   *   如果你想打開文件進行附加操作,文件必須存在。A模式不同於W模式。文件不存在時,會拋出INVALID_OPERATION異常。
   *   FOPEN 會拋出以下異常:
        (1)UTL_FILE.INVALID_MODE
        (2)UTL_FILE.INVALID_OPERATION
        (3)UTL_FILE.INVALID_PATH
        (4)UTL_FILE.INVALID_MAXLINESIZE

3.2 IS_OPEN()
英文解釋:Returns True If A File Handle Is Open: Otherwise False
utl_file.is_open(file IN FILE_TYPE) RETURN BOOLEAN;
3.3 GET_LINE()
英文解釋:Read a Line from a file
用法:
utl_file.getline(
    file   IN  FILE_TYPE,
    buffer OUT VARCHAR2,
    len    IN  BINARY_INTEGER DEFAULT NULL);
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

3.4 PUT()
英文解釋:Writes a string to a file
用法:
utl_file.put(file IN FILE_TYPE, buffer IN VARCHAR2);
函數原型:
    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.INVALID_FILEHANDLE
    UTL_FILE.INVALID_OPERATION
    UTL_FILE.WRITE_ERROR
3.5 NEW_LINE()
英文解釋:Writes one or more operating system-specific line terminators to a file
用法:
utl_file.new_line(file IN FILE_TYPE, lines IN NATURAL := 1);
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或負數,什么都不會寫入文件。
異常:
    VALUE_ERROR
    UTL_FILE.INVALID_FILEHANDLE
    UTL_FILE.INVALID_OPERATION
    UTL_FILE.WRITE_ERROR
3.6 PUT_LINE()
英文解釋:Writes a line to a file.  Appends an operating system-specific line terminator
用法:
utl_file.put_line(
file      IN FILE_TYPE,
buffer    IN VARCHAR2,
autoflush IN BOOLEAN DEFAULT FALSE);
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.INVALID_FILEHANDLE
    UTL_FILE.INVALID_OPERATION
    UTL_FILE.WRITE_ERROR
3.7 PUTF()
英文解釋:A PUT procedure with formatting
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);
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個參數一一對應%s會被后面的參數依次填充,如果沒有足夠的參數,%s會被忽視,不被寫入文件
    n  換行符。在格式串中沒有個數限制
異常:
    UTL_FILE.INVALID_FILEHANDLE
    UTL_FILE.INVALID_OPERATION
    UTL_FILE.WRITE_ERROR
3.8 PUT_RAW()
  英文解釋:Accepts as input a RAW data value and writes the value to the output buffer

用法:
  utl_file.put_raw(
    file      IN file_type,
    buffer    IN RAW,
    autoflush IN BOOLEAN DEFAULT FALSE

           );
3.9 FCLOSE()
  函數作用:關閉命名的文件:
  utl_file.fclose(file IN OUT file_type);
3.10 FCLOSE_ALL()
  函數作用:關閉所有文件

3.11 FRENAME()
英文解釋:Rename An Operating System File
utl_file.frename (
  src_location  IN VARCHAR2,
  src_filename  IN VARCHAR2,
  dest_location IN VARCHAR2,
  dest_filename IN VARCHAR2,
  overwrite     IN BOOLEAN DEFAULT FALSE);
BEGIN
  utl_file.frename(v_pathna, 'test.txt', v_pathna, 'x.txt', TRUE);
END frename;
/
存儲過程FRENAME修改一個文件的名稱,這樣我們可以把一個文件從一個位置移動到另外一個位置。
函數原型:
FRENAME(location VARCHAR2,
          filename VARCHAR2,
          dest_dir VARCHAR2,
          dest_file VARCHAR2,
          [ overwrite BOOLEAN ])
 參數:
location
目錄名稱,存放在pg_catalog.edb_dir.dirname中,這個目錄包含要改名的文件。
filename
要改名的源文件名稱。
dest_dir
目錄名稱,存放在pg_catalog.edb_dir.dirname中,這個目錄是被改名文件所在的目錄。
dest_file
原始文件的新名稱。
overwrite
如果設置為”true”,在dest_dir目錄中覆蓋任何名為dest_file的文件。若設置為”false”,就會產生異常。這是缺省情況。
3.12 FREMOVE()
英文解釋:Delete An Operating System File
utl_file.fremove(location IN VARCHAR2, filename IN VARCHAR2);
-- dump.txt is created in the FCOPY demo
BEGIN
  utl_file.fremove(v_pathna, 'dump.txt');
END fremove;
/
3.13 FFLUSH()
英文解釋:Physically writes pending data to the file identified by the file handle
用法:
utl_file.fflush(file IN file_type);
函數原型:
    PROCEDURE UTL_FILE.FFLUSH (file IN UTL_FILE.FILE_TYPE);
參數說明:
    file   由FOPEN返回的文件句柄
注意:
    操作系統可能會緩存數據來提高性能。因此可能調用put后,打開文件卻看不到寫入的數據。在關閉文件前要讀取數據的話可以使用UTL_FILE.FFLUSH。
    典型的使用方法包括分析執行進度和調試紀錄。
異常:
    UTL_FILE.INVALID_FILEHANDLE
    UTL_FILE.INVALID_OPERATION
    UTL_FILE.WRITE_ERROR
3.14 FCOPY()
英文解釋:Copies a contiguous portion of a file to a newly created file
utl_file.fcopy(
src_location  IN VARCHAR2,
src_filename  IN VARCHAR2,
dest_location IN VARCHAR2,
dest_filename IN VARCHAR2,
start_line    IN BINARY_INTEGER DEFAULT 1,
end_line      IN BINARY_INTEGER DEFAULT NULL);
BEGIN
  utl_file.fcopy(v_pathna, 'test.txt', v_pathna, 'dump.txt');
END;
UTL_FILE.FCOPY
    存儲過程FCOPY把一個文件中文本拷貝到另外一個文件中。
函數原型:
FCOPY(location VARCHAR2, filename VARCHAR2,dest_dir VARCHAR2, dest_file VARCHAR2[, start_line PLS_INTEGER [, end_line PLS_INTEGER ] ])
參數
location
    表示目錄名稱,存放在pg_catalog.edb_dir.dirname中,這個目錄包含要拷貝的文件。
filename
    要拷貝文件的名稱。
dest_dir
    表示目錄名稱,存放在pg_catalog.edb_dir.dirname中,是源文件要拷貝到目的目錄。
dest_file
    目標文件的名稱。
start_line
    源文件中文本行號,用於指定開始拷貝的位置。缺省值是1。
end_line
    源文件中最后一行要拷貝文本的行號。如果省略這個參數或者這個參數為空,那么就一直拷貝到文件中最后一行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM