Oracle之UTL_FILE 包用法详解

UTL_FILE包可以用来读写操作系统上的文本文件,UTL_FILE提供了在客户端(FORM等等)和服务器端的文件访问功能。
创建测试目录:
新建一个command window;
创建目录:(以system用户登录数据库)
Sql代码  收藏代码
SQL> create or replace directory cux_log_dir as ‘/home/appltest/debug‘;  

Directory created
赋权限。
Sql代码  收藏代码
SQL> grant read, write on directory cux_log_dir to public;  

Grant succeeded  

检查目录是否成功创建
Sql代码  收藏代码
select * FROM all_directories dir WHERE dir.DIRECTORY_NAME = ‘CUX_LOG_DIR‘;
Ps:视图all_directories存放着我们能否访问的目录对象。如果要删除目录,也需用system用户登录数据库,执行如下命令:Drop directory cux_log_dir;

过程和函数:

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返回一个接下来我们的程序将要使用到的文件的指针

FCLOSE
功能:关闭一个打开的文件。
语法:UTL_FILE.FCLOSE (file IN OUT FILE_TYPE);
参数:1. file->调用FOPEN或者FOPEN_NVCHAR返回的活动中的文件指针。
注意事项:当FCLOSE执行的时候,如果还有缓冲数据没有及时写入到文件中,那么程序就会raise一个异常:WRITE_ERROR。可以在PUT_LINE的时候加上参数autoflush => TRUE;或者在每次PUT之后执行:FFLUSH。

FCLOSE_ALL
功能:此procedure将会关闭本次session所有打开的文件。它用来紧急情况的清理功能,例如当PL/SQL程序在EXCEPTION部分退出时。
语法:UTL_FILE.FCLOSE_ALL;
注意事项:FCLOSE_ALL不会修改所打开的文件的状态,也就是说执行了FCLOSE_ALL后,再用IS_OPEN去检测文件,结果还是打开状态,但是之后,这些文件任然是不能去read或者write的。而FCLOSE执行后,相关的文件则完全关闭了,测试:

结果为:

结果为:

FCOPY
功能:此procedure复制一个文件的连续部分内容或者全部内容到一个新创建的文件。如果参数start_line和end_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_DIRECTORIES的DIRECTORY_NAME;
             src_filename  将要被复制的来源文件
             dest_location 被创建的目标文件存放的目录名。
    dest_filename 从来源文件创建的目标文件。
    start_line  要复制的内容起始行号,默认为1,表示从第一行开始复制。
    end_line 要复制的内容的终止行号,默认NULL,表示文件的末尾。

测试程序之前:

测试代码:

测试程序之后:

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

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

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  文件系统块的字节大小。

测试:

Sql代码  收藏代码
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

FGETPOS
描述:此函数返回一个文件中当前的偏移位置。
语法:
UTL_FILE.FGETPOS (file IN FILE_TYPE) RETURN PLS_INTEGER;
   注意事项:如果file没有打开,则会抛出异常。
测试:
Sql代码  收藏代码
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

FREMOVE
描述:此procedure在你有充足的权限之下,删除一个磁盘上的文件。
语法:
UTL_FILE.FREMOVE ( location IN VARCHAR2,
      filename IN VARCHAR2);

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);
参数:介绍略。

GET_LINE
描述:此procedure从一个打开的文件中读取一行文本,直到遇到换行符。
语法:
UTL_FILE.GET_LINE ( file     IN FILE_TYPE,
     buffer OUT VARCHAR2,
     len      IN PLS_INTEGER DEFAULT NULL);
   参数:len 从文本中读取一次的长度,默认是null,oracle就取FOPEN时的max_linesieze。

IS_OPEN
描述:顾名思义。
语法:UTL_FILE.IS_OPEN (file IN FILE_TYPE)  RETURN BOOLEAN;

PUT
描述:PUT写入内容到文件中。(每写一次,不带换行符)
语法:UTL_FILE.PUT (file IN FILE_TYPE, buffer IN VARCHAR2);

PUT_LINE
描述:PUT_LINE写入内容到文件中。(每写一次,末尾都加一个换行符)
语法:
UTL_FILE.PUT_LINE ( file          IN FILE_TYPE,
     buffer      IN VARCHAR2,
              autoflush IN BOOLEAN DEFAULT FALSE);

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的值去代替。

完整例子程序:
Sql代码  收藏代码
    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;  

详细:http://zhangzhongjie.iteye.com/blog/1903024

 
时间: 2024-07-30 09:38:41

Oracle之UTL_FILE 包用法详解的相关文章

Oracle之DBMS_LOCK包用法详解

概述与背景 某些并发程序,在高并发的情况下,必须控制好并发请求的运行时间和次序,来保证处理数据的正确性和完整性.对于并发请求的并发控制,EBS系统可以通过Concurrent Program定义界面的Incompatibilities功能配置实现.但是Incompatibilities功能存在其局限性,它只能把整个并发请求作为一个整体来判断,并不能细化到并发请求的请求参数.而某些并发程序,只需要对其中某几个参数做并发控制,例如时间段,OU等.对于这种业务需求,可以使用标准包DBMS_LOCK,把

Oracle常用函数TO_CHAR用法详解(转自博客园-小小草博文)

The following are number examples for the to_char function. to_char(1210.73, '9999.9') would return '1210.7' to_char(1210.73, '9,999.99') would return '1,210.73' to_char(1210.73, '$9,999.00') would return '$1,210.73' to_char(21, '000099') would retur

oracle正则表达式regexp_like的用法详解

ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBSTR的功能相似4,REGEXP_REPLACE :与REPLACE的功能相似它们在用法上与Oracle SQL 函数LIKE.INSTR.SUBSTR 和REPLACE 用法相同,但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符.POSIX 正则表达式由标准的元字符(met

Oracle DECODE函数的用法详解

Oracle DECODE函数使用方法: 1.比较大小select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值sign()函数根据某个值是0.正数还是负数,分别返回0.1.-1例如:变量1=10,变量2=20则sign(变量1-变量2)返回-1,decode解码结果为"变量1",达到了取较小值的目的.2.此函数用在SQL语句中,功能介绍如下:Decode函数与一系列嵌套的 IF-THEN-ELSE语句相似.base_exp与co

golang格式化输出-fmt包用法详解

注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org    声明: 此片文章并非原创,大多数内容都是来自:https://godoc.org/fmt,通过谷歌翻译进行翻译而来.   import "fmt" fmt包实现了类似C语言printf和scanf的格式化I/O.格式化verb('verb')源自C语言但更简单. Printing verb: 通用: 1 %v 值的默认格式表示.当输出结构体时,扩展标志(%+v)会添加字段名 2 %#v 值的

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之后的版本,只需要先创建一个路径即可.

rpm包管理器用法详解

1,简介 rpm(Red Hat Pakage Manager),现在更名为RPM Package Manager,是一款业界公认的标准包管理器.所谓包管理器,就是把编译好的应用软件的各组成部分组成一个或几个程序包文件,从而实现程序包的安装,升级,卸载和查询等相关操作.广泛应用与redhat,centos,opensuse等发行版本上.当然,Dibian系列用的包管理器是dpkg. 2.rpm的组成 二进制程序,配置文件,帮助手册,以及如何组织,安装等其他元数据信息,不过,rpm都能理解. 3,

oracle中的exists 和not exists 用法详解

oracle中的exists 和not exists 用法详解 有两个简单例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高. 2) select * from T1 where T1.a in (select T2.a from T2) ; T1数据量非常大而T2数据量小时,T1>

Oracle之外键(Foreign Key)用法详解(一)

Oracle外键(Foreign Key)用法详解(一) 1.目标 演示如何在Oracle数据库中使用外键 2.什么是外键? 1)在Oracle数据库中,外键是用来实现参照完整性的方法之一.打个形象的比喻,外键是指定义外键的表的列的值必须在另一个表中出现. 2)被参照的表称之为父表(parent table),创建外键的表称之为子表(child table).子表中的外键关联了父表中的主键. 3)外键可以在创建表时定义或者通过ALTER TABLE语句创建. 3.创建表时定义外键 语法: CRE