`

Oracle之UTL_FILE 包用法详解

 
阅读更多

UTL_FILE包可以用来读写操作系统上的文本文件,UTL_FILE提供了在客户端(FORM等等)和服务器端的文件访问功能。

创建测试目录:

  1. 新建一个command window
  2. 创建目录:(以system用户登录数据库)
SQL> create or replace directory cux_log_dir as '/home/appltest/debug';

Directory created
  1. 赋权限。
SQL> grant read, write on directory cux_log_dir to public;

Grant succeeded

 

  1. 检查目录是否成功创建
    select * FROM all_directories dir WHERE dir.DIRECTORY_NAME = 'CUX_LOG_DIR';

Ps:视图all_directories存放着我们能否访问的目录对象。如果要删除目录,也需用system用户登录数据库,执行如下命令:Drop directory cux_log_dir;

 

过程和函数:

  1. FOPEN

描述:打开一个文件,基本上在我们对文件进行读写动作之前都需要先执行这个function来打开文件先。

语法

UTL_FILE.FOPEN (  location IN VARCHAR2,

filename IN VARCHAR2,

open_mode IN VARCHAR2,

max_linesize IN BINARY_INTEGER DEFAULT 1024)  RETURN FILE_TYPE;

参数location   略。

            Filename  略。

            open_mode  指明文件打开的模式。有如下几种:

r 只读(文本)

w – 只写(本文)

a – 追加(文本)

rb – 只读(字节)

wb – 只写(字节)

ab – 追加(字节)

                     (注:当使用模式:a或者ab的时候,如果文件不存在,则会以write模式创建此文件)

        max_linesize   指定文件文本每一行存放的最大字符数。

     返回值:FOPEN返回一个接下来我们的程序将要使用到的文件的指针

 

  1. FCLOSE

功能:关闭一个打开的文件。

语法UTL_FILE.FCLOSE (file IN OUT FILE_TYPE);

参数1. file->调用FOPEN或者FOPEN_NVCHAR返回的活动中的文件指针。

注意事项:当FCLOSE执行的时候,如果还有缓冲数据没有及时写入到文件中,那么程序就会raise一个异常:WRITE_ERROR。可以在PUT_LINE的时候加上参数autoflush => TRUE;或者在每次PUT之后执行:FFLUSH

 

  1. FCLOSE_ALL

功能:此procedure将会关闭本次session所有打开的文件。它用来紧急情况的清理功能,例如当PL/SQL程序在EXCEPTION部分退出时。

语法UTL_FILE.FCLOSE_ALL;

注意事项FCLOSE_ALL不会修改所打开的文件的状态,也就是说执行了FCLOSE_ALL后,再用IS_OPEN去检测文件,结果还是打开状态,但是之后,这些文件任然是不能去read或者write的。而FCLOSE执行后,相关的文件则完全关闭了,测试:

结果为:


结果为:

 

  1. FCOPY

功能:此procedure复制一个文件的连续部分内容或者全部内容到一个新创建的文件。如果参数start_lineend_line省略的话,默认地会复制整个文件。此操作会将源文件以read模式打开,将目标文件以write模式打开。

语法

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);

 

参数:src_location来源文件的目录名。取值来源是视图ALL_DIRECTORIESDIRECTORY_NAME

             src_filename  将要被复制的来源文件

             dest_location 被创建的目标文件存放的目录名。

    dest_filename 从来源文件创建的目标文件。

    start_line  要复制的内容起始行号,默认为1,表示从第一行开始复制。

    end_line 要复制的内容的终止行号,默认NULL,表示文件的末尾。

 

测试程序之前:

测试代码:

测试程序之后:

并且l001-copy.log文件中的内容只有两行:

 

  1. FFLUSH

描述FFLUSH强制将缓冲的数据写入文件。因为通常待写入文件的数据都是都在缓冲存储位置。当有必要去read一个任然处于打开状态的文件时,FFLUSH就起作用了,例如在调试程序中,可以将调试的消息及时冲到文件中,已便于我们马上就能read这些内容。

语法

UTL_FILE.FFLUSH (file IN FILE_TYPE);

  

  1. FGETATTR

描述FGETATTR读取磁盘上的文件并返回文件的属性。

语法UTL_FILE.FGETATTR( location IN VARCHAR2,

filename IN VARCHAR2,

fexists OUT BOOLEAN,

file_length OUT NUMBER,

block_size OUT BINARY_INTEGER);

   参数:location 此处略去X个字。

      filename此处略去X个字。

      fexists 返回的属性1:文件是否存在

      file_length 返回的属性2:文件字节长度,如果文件不存在,则返回NULL

      block_size  文件系统块的字节大小。

 

测试:

 

DECLARE
  l_loc         all_directories.directory_name%TYPE := 'CUX_LOG_DIR';
  l_file        utl_file.file_type;
  l_file_exsits BOOLEAN;
  l_file_length NUMBER;
  l_block_size  BINARY_INTEGER;
  l_buffer      VARCHAR2(1024);
BEGIN
  utl_file.fgetattr(location    => l_loc,
                    filename    => 'l001.log',
                    fexists     => l_file_exsits,
                    file_length => l_file_length,
                    block_size  => l_block_size);
    IF l_file_exsits THEN
  
  l_file := utl_file.fopen(location  => l_loc,
                           filename  => 'l001.log',
                           open_mode => 'R');
  dbms_output.put_line('file exsits');
  dbms_output.put_line('file length:' || l_file_length);
  dbms_output.put_line('block sieze :' || l_block_size);
END IF;
utl_file.fclose_all;

END;

 

 

输出结果:

 file exsits

file length:39802

block sieze :4096

 

 

  1. FGETPOS

描述:此函数返回一个文件中当前的偏移位置。

语法

UTL_FILE.FGETPOS (file IN FILE_TYPE) RETURN PLS_INTEGER;

   注意事项:如果file没有打开,则会抛出异常。

测试:

DECLARE
  l_loc    all_directories.directory_name%TYPE := 'CUX_LOG_DIR';
  l_file   utl_file.file_type;
  l_buffer VARCHAR2(32767);
BEGIN
  l_file := utl_file.fopen(location  => l_loc,
                           filename  => 'l001.log',
                           open_mode => 'R');
  dbms_output.put_line('before get_line: current position is ' || utl_file.fgetpos(file => l_file));
  utl_file.get_line(file   => l_file,
                    buffer => l_buffer);
  dbms_output.put_line('after  get_line: current position is ' || utl_file.fgetpos(file => l_file));
  utl_file.fclose_all;

END;

 

 

 

 

结果:before get_line: current position is 0

   after  get_line: current position is 3

  

  1. FREMOVE

描述:此procedure在你有充足的权限之下,删除一个磁盘上的文件。

语法

UTL_FILE.FREMOVE ( location IN VARCHAR2,

      filename IN VARCHAR2);

 

  1. FRENAME

描述:此procedure将一个存在的文件重命名,类似unix命令:mv

语法

UTL_FILE.FRENAME ( src_location   IN VARCHAR2,

     src_filename  IN VARCHAR2,

     dest_location  IN VARCHAR2,

     dest_filename IN VARCHAR2,

     overwrite        IN BOOLEAN DEFAULT FALSE);

参数:介绍略。

 

  1. GET_LINE

描述:此procedure从一个打开的文件中读取一行文本,直到遇到换行符。

语法

UTL_FILE.GET_LINE ( file     IN FILE_TYPE,

     buffer OUT VARCHAR2,

     len      IN PLS_INTEGER DEFAULT NULL);

   参数:len 从文本中读取一次的长度,默认是nulloracle就取FOPEN时的max_linesieze

 

  1. IS_OPEN

描述:顾名思义。

语法UTL_FILE.IS_OPEN (file IN FILE_TYPE)  RETURN BOOLEAN;

 

  1. PUT

描述PUT写入内容到文件中。(每写一次,不带换行符)

语法UTL_FILE.PUT (file IN FILE_TYPE, buffer IN VARCHAR2);

 

  1. PUT_LINE

描述PUT_LINE写入内容到文件中。(每写一次,末尾都加一个换行符)

语法

UTL_FILE.PUT_LINE ( file          IN FILE_TYPE,

     buffer      IN VARCHAR2,

              autoflush IN BOOLEAN DEFAULT FALSE);

 

  1. PUTF

描述    写入格式化的内容到文件中。好比C语言的printf()

语法

UTL_FILE.PUTF ( file IN FILE_TYPE,

     format IN VARCHAR2,

     [arg1 IN VARCHAR2 DEFAULT NULL,

      . . .

              arg5 IN VARCHAR2 DEFAULT NULL]);

 

参数:format 包含格式化字符[\n%s]的内容。

   \n:代表一个换行符。

   %s:用arg1~5的值去代替。

 

完整例子程序:

	DECLARE
	  l_loc         all_directories.directory_name%TYPE := 'CUX_LOG_DIR';
	  l_file        utl_file.file_type;
	  l_file_exsits BOOLEAN;
	  l_file_length NUMBER;
	  l_block_size  BINARY_INTEGER;
	  l_buffer      VARCHAR2(32767);
	             
	  --data
	  CURSOR c_hander IS
	    SELECT fu.user_name, fu.description
	      FROM fnd_user fu
	     WHERE 1 = 1
	       AND fu.user_name LIKE 'XXX%'
	     ORDER BY fu.user_name;
	 
	BEGIN
	  utl_file.fgetattr(location    => l_loc,
	                    filename    => 'test.log',
	                    fexists     => l_file_exsits,
	                    file_length => l_file_length,
	                    block_size  => l_block_size);
	  --put
	  IF l_file_exsits THEN
	    l_file   := utl_file.fopen(location  => l_loc,
	                               filename  => 'test.log',
	                               open_mode => 'w');
      l_buffer := 'begining of file....';
      utl_file.put_line(file   => l_file,
                        buffer => l_buffer);
      FOR l IN c_hander LOOP
        l_buffer := l.user_name || chr(9) || nvl(l.description,
                                                 'no description');
        utl_file.put_line(file   => l_file,
                          buffer => l_buffer);
      END LOOP;
      l_buffer := 'end of file....';
      utl_file.put_line(file   => l_file,
                        buffer => l_buffer);
    
      --flush
      utl_file.fflush(file => l_file);
    
      --get
      l_file := utl_file.fopen(location  => l_loc,
                               filename  => 'test.log',
                               open_mode => 'r');
    
      utl_file.fgetattr(location    => l_loc,
                        filename    => 'test.log',
                        fexists     => l_file_exsits,
                        file_length => l_file_length,
                        block_size  => l_block_size);
    
      LOOP
        utl_file.get_line(file   => l_file,
                          buffer => l_buffer,
                          len    => 32767);
        dbms_output.put_line(a => l_buffer);
      
        EXIT WHEN utl_file.fgetpos(file => l_file) = l_file_length;
      END LOOP;
    
    END IF;
    utl_file.fclose_all;

END;

 

 

  • 大小: 24.2 KB
  • 大小: 2.1 KB
  • 大小: 24.6 KB
  • 大小: 2 KB
  • 大小: 1 KB
  • 大小: 16.2 KB
  • 大小: 2.2 KB
  • 大小: 15.1 KB
2
1
分享到:
评论

相关推荐

    oracle utl_file包的用法

    ### Oracle UTL_FILE 包详解 #### 概述 `UTL_FILE`是Oracle数据库中一个重要的包,它提供了一套完整的文件输入/输出(I/O)操作接口,允许PL/SQL程序直接读写文件系统中的文件。这使得在Oracle环境中进行文件处理...

    UTL_FILE用法详解

    UTL_FILE 用法详解 UTL_FILE 是 Oracle 数据库中提供的一个包,提供了在操作系统层面上对文件系统中文件的读写功能。非超级用户在使用 UTL_FILE 中任何函数或存储过程前必须由超级用户授予在这个包上的 EXECUTE ...

    utl_mail_scheduler

    ### UTL_MAIL与Oracle Scheduler详解 #### UTL_MAIL:Oracle中的邮件发送工具 UTL_MAIL是Oracle提供的一个用于发送电子邮件的内置程序包。通过UTL_MAIL,开发人员可以在Oracle环境中轻松实现邮件通知功能,这对于...

    在oracle9i如何在PL-SQL中读写文件.doc

    在Oracle 9i中使用PL/SQL进行文件读写,需要熟练掌握UTL_FILE包的使用方法,包括如何正确设置参数、处理异常以及编写有效的存储过程。这不仅可以提高数据处理的灵活性,还能增强应用程序的功能性和健壮性。

    oracle_plsql_编程详解

    ### Oracle PL/SQL 编程详解 #### 一、PL/SQL 概述 ##### 1.1 什么是 PL/SQL? PL/SQL(Procedure Language for SQL)是Oracle数据库的一种专用编程语言,它将SQL语句与过程化的编程语言特性相结合,提供了强大的...

    oracle 调用webservice

    Oracle 调用 Webservice 实现详解 本文将详细介绍 Oracle 调用 Webservice 的实现过程,包括 Webservice 的基本概念、 Java 编写简单的 WebService 实例、Oracle 服务器端配置、加载 JAR 包、测试调用 ...

    orcle读取文件

    本文详细介绍了如何在Oracle数据库中创建目录、授予访问权限、使用`UTL_FILE`包来读取与写入文件的方法。通过这些技术,可以有效地提高Oracle数据库的灵活性和可扩展性,使得数据库开发人员能够在数据库层面轻松处理...

    Plsql操作excel.docx

    UTL_FILE是Oracle提供的一个内建包,用于读写操作系统文件。在描述的示例中,它被用来创建一个简单的CSV格式的文件,模拟Excel文件。以下是使用UTL_FILE创建Excel文件的基本步骤: ```sql DECLARE l_file UTL_FILE...

    oracle xml 转换 存储过程

    4. **写入XML文件**:使用`UTL_FILE`包将格式化后的XML字符串写入指定目录下的文件中。 ```sql output_file := UTL_FILE.FOPEN('TEST_DIR', filename, 'w'); UTL_FILE.put(output_file, xmlstr); UTL_FILE....

    Oracle实现发送邮件

    此过程涉及Oracle数据库提供的多个包,如`UTL_SMTP`用于SMTP协议的交互、`UTL_FILE`用于文件读取等。 #### 核心知识点详解 ##### 存储过程定义 存储过程`PROCSENDEMAIL`被设计为接收多个参数,这些参数用于配置...

    oracle webservice实例

    Oracle WebService 实例详解 在 Oracle 应用开发中,Web Service 是一种常见的技术,它允许不同的系统通过标准的 XML 格式进行通信。本文将深入探讨如何在 Oracle 环境下创建和使用 Web Service 的一个实际示例,...

    Oracle PLSQL 编程

    - **电子邮件发送**:使用UTL_MAIL和UTL_SMTP包发送电子邮件。 - **Web I/O**:利用UTL_HTTP包进行HTTP请求,实现与Web服务的交互。 #### 七、全球化和本地化 - **字符集支持**:讨论了如何处理不同字符集的问题,...

    oracle入侵与SQL注射技巧

    ### Oracle入侵与SQL注入技巧详解 #### 一、Oracle数据库特性及SQL注入基础 在讨论Oracle入侵与SQL注入技巧之前,我们首先需要了解Oracle数据库的一些基本特性以及SQL注入的基础概念。 **1.1 Oracle数据库简介** ...

    oracle数据库的表数据导出为csv文件

    ### Oracle数据库表数据导出为CSV文件的知识点详解 #### 一、背景介绍 在日常工作中,我们常常需要将Oracle数据库中的表数据导出为CSV文件格式,以便于数据分析、备份或其他用途。本文将详细介绍如何使用Oracle PL/...

    ORACLE 表数据写成TXT文本,CVS等格式存储过程

    ### ORACLE 表数据导出至TXT或CSV格式的存储过程详解 #### 一、背景与目的 在数据库管理工作中,经常会遇到需要将Oracle表中的数据导出为其他格式(如TXT、CSV)的需求,特别是在进行数据分析或者与其他系统进行...

    Oracle+Logminer使用和安装步骤及恢复例子

    ### Oracle Logminer 使用和安装步骤详解 #### 一、Oracle Logminer 概述 Oracle Logminer 是一个强大的工具,用于挖掘 Oracle 数据库 Redo 日志中的数据更改信息。通过 Logminer,用户可以追踪数据库表的变化情况...

    oracle日志分析工具LogMiner使用

    ### Oracle日志分析工具LogMiner使用详解 #### 一、概述 Oracle LogMiner是Oracle数据库提供的一个强大工具,用于分析重做日志文件,提取数据库中的...希望本文能帮助您更好地理解和掌握Oracle LogMiner的使用方法。

    PL/SQL examples

    - `utlfile.ora`:这可能是UTL_FILE包的配置文件,定义了文件操作的一些设置。 - `cah.pkg`:未提供具体描述,可能包含自定义的PL/SQL功能或业务逻辑。 通过这些示例,初学者可以深入了解PL/SQL的语法、流程控制...

    oracle日志挖掘方法

    ### Oracle日志挖掘方法 #### 一、概述 在Oracle数据库管理中,日志挖掘(Log Mining)是一项非常重要的功能,它能够帮助我们追踪数据库活动并发现潜在的问题或异常行为。通过日志挖掘,我们可以详细了解数据库中...

Global site tag (gtag.js) - Google Analytics