隨筆 - 6  文章 - 129  trackbacks - 0
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(14)

          隨筆檔案(6)

          文章分類(467)

          文章檔案(423)

          相冊

          收藏夾(18)

          JAVA

          搜索

          •  

          積分與排名

          • 積分 - 826629
          • 排名 - 49

          最新評論

          閱讀排行榜

          評論排行榜

          最近接觸了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



          posted on 2009-02-11 20:26 Ke 閱讀(1159) 評論(0)  編輯  收藏 所屬分類: oracle
          主站蜘蛛池模板: 鄂温| 闽侯县| 平罗县| 卓尼县| 资兴市| 合江县| 沭阳县| 平南县| 三门县| 礼泉县| 集贤县| 邛崃市| 麻阳| 依兰县| 金阳县| 佛学| 游戏| 丹凤县| 定西市| 虎林市| 临城县| 蒙城县| 黑龙江省| 镇江市| 东山县| 印江| 澎湖县| 高要市| 花垣县| 海丰县| 天全县| 太仆寺旗| 武威市| 资源县| 大洼县| 青海省| 永仁县| 互助| 信阳市| 娱乐| 连云港市|