<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    常用鏈接

    留言簿(14)

    隨筆檔案(6)

    文章分類(467)

    文章檔案(423)

    相冊

    收藏夾(18)

    JAVA

    搜索

    •  

    積分與排名

    • 積分 - 825769
    • 排名 - 49

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    最近接觸了Oracle的讀寫文件操作,于是使用到UTL_FILE包,再網(wǎng)上查找到一些有用的信息,在此和大家分享一下。

          以下翻譯來自《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會(huì)打開指定文件并返回一個(gè)文件句柄用于操作文件。
    所有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 寫(替換)模式。文件的所有行會(huì)被刪除。PUT, PUT_LINE, NEW_LINE, PUTF和FFLUSH都可使用
    A 寫(附加)模式。原文件的所有行會(huì)被保留。在最末尾行附加新行。PUT, PUT_LINE, NEW_LINE, PUTF和FFLUSH都可使用

    打開文件時(shí)注意以下幾點(diǎn):
    文件路徑和文件名合起來必須表示操作系統(tǒng)中一個(gè)合法的文件。
    文件路徑必須存在并可訪問;FOPEN并不會(huì)新建一個(gè)文件夾。
    如果你想打開文件進(jìn)行讀操作,文件必須存在;如果你想打開文件進(jìn)行寫操作,文件不存在時(shí),會(huì)新建一個(gè)文件。
    如果你想打開文件進(jìn)行附加操作,文件必須存在。A模式不同于W模式。文件不存在時(shí),會(huì)拋出INVALID_OPERATION異常。

    FOPEN 會(huì)拋出以下異常
    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只提供一個(gè)方法去讀取數(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必須足夠大。否則,會(huì)拋出VALUE_ERROR 異常。行終止符不會(huì)被傳進(jìn)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ù)時(shí)不會(huì)附加行終止符。

    UTL_FILE.PUT會(huì)產(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會(huì)使用默認(rèn)值1,在當(dāng)前行尾換行。如果要插入一個(gè)空白行,可以使用以下語句:
    UTL_FILE.NEW_LINE (my_file, 2);
    如果lines參數(shù)為0或負(fù)數(shù),什么都不會(huì)寫入文件。

    NEW_LINE會(huì)產(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
    輸出一個(gè)字符串以及一個(gè)與系統(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會(huì)產(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
    以一個(gè)模版樣式輸出至多5個(gè)字符串,類似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個(gè)參數(shù),最多5個(gè)

    格式串可使用以下樣式
    %s
    在格式串中可以使用最多5個(gè)%s,與后面的5個(gè)參數(shù)一一對(duì)應(yīng)
    \n
    換行符。在格式串中沒有個(gè)數(shù)限制
    %s會(huì)被后面的參數(shù)依次填充,如果沒有足夠的參數(shù),%s會(huì)被忽視,不被寫入文件

    UTL_FILE.PUTF會(huì)產(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)可能會(huì)緩存數(shù)據(jù)來提高性能。因此可能調(diào)用put后,打開文件卻看不到寫入的數(shù)據(jù)。在關(guān)閉文件前要讀取數(shù)據(jù)的話可以使用UTL_FILE.FFLUSH。
    典型的使用方法包括分析執(zhí)行進(jìn)度和調(diào)試紀(jì)錄。
    UTL_FILE.FFLUSH會(huì)產(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是一個(gè)IN OUT參數(shù),因?yàn)樵陉P(guān)閉文件后會(huì)設(shè)置為NULL
    當(dāng)試圖關(guān)閉文件時(shí)有緩存數(shù)據(jù)未寫入文件,會(huì)拋出WRITE_ERROR異常

    UTL_FILE.FCLOSE會(huì)產(chǎn)生以下異常
    UTL_FILE.INVALID_FILEHANDLE
    UTL_FILE.WRITE_ERROR

    UTL_FILE.FCLOSE_ALL
    關(guān)閉所有已打開的文件
    PROCEDURE UTL_FILE.FCLOSE_ALL;

    在結(jié)束程序時(shí)要確保所有打開的文件已關(guān)閉,可使用FCLOSE_ALL
    也可以在EXCEPTION使用,當(dāng)異常退出時(shí),文件也會(huì)被關(guān)閉。
    EXCEPTION
       WHEN OTHERS
      
    THEN
          UTL_FILE.FCLOSE_ALL;
          ... other clean up activities ...
    END;

    注意:當(dāng)使用FCLOSE_ALL關(guān)閉所有文件時(shí),文件句柄并不會(huì)標(biāo)記為NULL,使用IS_OPEN會(huì)返回TRUE。但是,那些關(guān)閉的文件不能執(zhí)行讀寫操作(除非你再次打開文件)。
    UTL_FILE.FCLOSE_ALL會(huì)產(chǎn)生以下異常
    UTL_FILE.WRITE_ERROR



    posted on 2009-02-11 20:26 Ke 閱讀(1156) 評(píng)論(0)  編輯  收藏 所屬分類: oracle
    主站蜘蛛池模板: 亚洲伊人精品综合在合线| 免费又黄又爽又猛大片午夜| 免费看少妇作爱视频| 四虎影视永久在线精品免费| 亚洲大尺度无码无码专区| 永久免费毛片在线播放| 精品国产呦系列在线观看免费| 亚洲成人黄色在线| 亚洲精品视频免费| 无码乱肉视频免费大全合集| 一级做α爱过程免费视频| 亚洲人成电影网站| 亚洲精品国产电影| 无人在线观看完整免费版视频| eeuss免费天堂影院| 亚洲国产成人综合| 亚洲日韩欧洲乱码AV夜夜摸| 午夜神器成在线人成在线人免费| 999zyz**站免费毛片| 亚洲自偷自偷在线成人网站传媒| 亚洲国产成人高清在线观看| 国产精品成人免费综合| 日韩亚洲欧洲在线com91tv| 欧洲亚洲综合一区二区三区| 欧洲人免费视频网站在线| 亚洲va在线va天堂va手机| 三上悠亚亚洲一区高清| 日本免费中文字幕在线看| 182tv免费视视频线路一二三 | selaoban在线视频免费精品| 久久精品国产99国产精品亚洲| 亚洲s色大片在线观看| 亚洲精品国产日韩无码AV永久免费网 | 成人免费无码大片A毛片抽搐| 中文字幕av无码不卡免费| 亚洲精品无码高潮喷水A片软| 亚洲日本在线播放| 久久综合日韩亚洲精品色| 国产成人亚洲综合无码| 免费v片视频在线观看视频| 97无码免费人妻超级碰碰夜夜|