zoukankan      html  css  js  c++  java
  • utl_file包的使用

    包中主要的函数

    FOPEN
    IS_OPEN
    GET_LINE
    PUT
    NEW_LINE
    PUT_LINE
    PUTF
    FFLUSH
    FCLOSE
    FCLOSE_ALL
    使用utl_file包之前应先建立目录

    create or replace directory BFILE_DIR as
    'f:/home/oracle/bfiletest';

    给用户读写该目录的权限

    grant read,write on directory BFILE_DIR  to lunar;

    GRANT EXECUTE ON utl_file TO wangyh
    UTL_FILE.FOPEN

    用法
    FOPEN会打开指定文件并返回一个文件句柄用于操作文件。

      FUNCTION UTL_FILE.FOPEN (
        location     IN VARCHAR2,
         filename     IN VARCHAR2,
          open_mode    IN VARCHAR2,
               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读取数据到文件:
    declare
       fileID UTL_FILE.FILE_TYPE;
    BEGIN
       fileID := UTL_FILE.FOPEN ('BFILE_DIR', 'emp.TXT', 'W');
       /* Quick and dirty construction here! */
       FOR emprec IN (SELECT * FROM emp)
       LOOP
          UTL_FILE.PUT_LINE
             (FILEID,TO_CHAR (emprec.empno) || ',' ||
              emprec.ename || ',' ||
              TO_CHAR (emprec.deptno));
       END LOOP;
       UTL_FILE.FCLOSE (fileID);
    END;
    /
    GRANT READ ON DIRECTORY BFILE_DIR TO SCOTT;
    GRANT write ON DIRECTORY BFILE_DIR TO SCOTT;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

    declare
       fileID UTL_FILE.FILE_TYPE;
    BEGIN
       fileID := UTL_FILE.FOPEN ('BFILE_DIR', 'emp.TXT', 'W');
       /* Quick and dirty construction here! */
       FOR emprec IN (SELECT * FROM emp)
       LOOP
          UTL_FILE.PUTf
             (FILEID,TO_CHAR (emprec.empno) || ',' ||
              emprec.ename || ',' ||
              TO_CHAR (emprec.deptno),',');
    utl_file.new_line(fileid);
       END LOOP;
       UTL_FILE.FCLOSE (fileID);
    END;
    /

    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

  • 相关阅读:
    ASP.NET2.0中将文件上传到数据库
    C#中数据类型转换
    数据绑定以及Container.DataItem的具体分析
    CodeSmith开发系列资料总结
    Jquery信息专题收集
    microsoft .net framework专题汇总
    ASP.NET中插入FLASH代码
    javascript专题汇总
    经典SQL行列转换
    前台js调用后台c#方法
  • 原文地址:https://www.cnblogs.com/toowang/p/2818653.html
Copyright © 2011-2022 走看看