ITPub博客

首页 > Linux操作系统 > Linux操作系统 > UTL_FILE包详解(第一篇)

UTL_FILE包详解(第一篇)

原创 Linux操作系统 作者:javaxf 时间:2013-05-08 22:15:15 0 删除 编辑

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 会抛出以下异常

        UTL_FILE.INVALID_MODE

        UTL_FILE.INVALID_OPERATION

        UTL_FILE.INVALID_PATH

        UTL_FILE.INVALID_MAXLINESIZE

 

测试用例

DECLARE

  v_output  utl_file.file_type;

  v_contxt  VARCHAR2(250);

  v_pathna varchar2(10);

BEGIN

  v_pathna := 'utl_file_dir';

  v_output:= utl_file.fopen(v_pathna, 'test.txt', 'R');

  LOOP

    BEGIN

      utl_file.get_line(v_output, v_contxt);

      dbms_output.put_line(v_contxt);

    EXCEPTION

      WHEN OTHERS THEN

        EXIT;

    END;

  END LOOP;

  utl_file.fclose(v_output);

END ;

/

(2) Open A File For Write Operations

  := utl_file.fopen('W')

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

 

--测试用例

DECLARE

  v_output utl_file.file_type;

  v_lntext VARCHAR2(250);

  v_pathna VARCHAR2(200);

  v_sql    VARCHAR2(255);

 

BEGIN

  v_pathna := 'UTL_FILE_DIR';

  v_output := utl_file.fopen('UTL_FILE_DIR', 'test.txt', 'W');

 

  FOR cour_b IN (SELECT a.owner || ',' || a.object_name || ',' ||

                         a.object_type || ',' || a.status AS column_text

                   FROM dba_objects a

                  WHERE a.owner = 'SCOTT') LOOP

    v_sql := cour_b.column_text;

 

    utl_file.putf(v_output, v_sql);

    dbms_output.put_line(v_sql);

   

  END LOOP;

 

  IF (utl_file.is_open(v_output)) THEN

      dbms_output.put_line('文件已经打开了');

      --utl_file.put(v_output, 'aaaaaaaa');

    ELSE

    dbms_output.put_line('文件关闭');

  END IF;

 

  /* LOOP

    BEGIN

      utl_file.get_line(v_output, v_lntext);

      dbms_output.put_line(v_lntext);

    EXCEPTION

      WHEN OTHERS THEN

        EXIT;

    END;

   END LOOP;

  */

  utl_file.fclose(v_output);

END fopen;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21835737/viewspace-760177/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-05-21

  • 博文量
    5
  • 访问量
    19670