zoukankan      html  css  js  c++  java
  • 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
        源文件中最后一行要拷贝文本的行号。如果省略这个参数或者这个参数为空,那么就一直拷贝到文件中最后一行。

  • 相关阅读:
    Windows 下Nexus搭建Maven私服
    WebService中获取request对象一例
    利用window.navigator.userAgent判断当前是否微信内置浏览器
    批量插入写法
    MySql 使用递归函数时遇到的级联删除问题
    【Mysql】 你会用 information_schema吗?
    Volatile 多线程中用到的关键字
    spring+springMVC中使用@Transcational方式管理事务的必须要配的东西。
    Android中操作SQLite数据库
    Oracle中的字符处理方法
  • 原文地址:https://www.cnblogs.com/oracle-dba/p/3856130.html
Copyright © 2011-2022 走看看