zoukankan      html  css  js  c++  java
  • Oracle之UTL_FILE 包用法详解

    [转自] http://zhangzhongjie.iteye.com/blog/1903024


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

    创建测试目录:

    1. 新建一个command window
    2. 创建目录:(以system用户登录数据库)
    Sql代码  收藏代码
    1. SQL> create or replace directory cux_log_dir as '/home/appltest/debug';  
    2.   
    3. Directory created  
    1. 赋权限。
    Sql代码  收藏代码
    1. SQL> grant read, write on directory cux_log_dir to public;  
    2.   
    3. Grant succeeded  
    1. 检查目录是否成功创建
      Sql代码  收藏代码
      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  文件系统块的字节大小。

     

    测试:

     

    Sql代码  收藏代码
    1. DECLARE  
    2.   l_loc         all_directories.directory_name%TYPE := 'CUX_LOG_DIR';  
    3.   l_file        utl_file.file_type;  
    4.   l_file_exsits BOOLEAN;  
    5.   l_file_length NUMBER;  
    6.   l_block_size  BINARY_INTEGER;  
    7.   l_buffer      VARCHAR2(1024);  
    8. BEGIN  
    9.   utl_file.fgetattr(location    => l_loc,  
    10.                     filename    => 'l001.log',  
    11.                     fexists     => l_file_exsits,  
    12.                     file_length => l_file_length,  
    13.                     block_size  => l_block_size);  
    14.     IF l_file_exsits THEN  
    15.     
    16.   l_file := utl_file.fopen(location  => l_loc,  
    17.                            filename  => 'l001.log',  
    18.                            open_mode => 'R');  
    19.   dbms_output.put_line('file exsits');  
    20.   dbms_output.put_line('file length:' || l_file_length);  
    21.   dbms_output.put_line('block sieze :' || l_block_size);  
    22. END IF;  
    23. utl_file.fclose_all;  
    24.   
    25. END;  

     

    输出结果:

     file exsits

    file length:39802

    block sieze :4096

     

     

    1. FGETPOS

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

    语法

    UTL_FILE.FGETPOS (file IN FILE_TYPE) RETURN PLS_INTEGER;

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

    测试:

    Sql代码  收藏代码
    1. DECLARE  
    2.   l_loc    all_directories.directory_name%TYPE := 'CUX_LOG_DIR';  
    3.   l_file   utl_file.file_type;  
    4.   l_buffer VARCHAR2(32767);  
    5. BEGIN  
    6.   l_file := utl_file.fopen(location  => l_loc,  
    7.                            filename  => 'l001.log',  
    8.                            open_mode => 'R');  
    9.   dbms_output.put_line('before get_line: current position is ' || utl_file.fgetpos(file => l_file));  
    10.   utl_file.get_line(file   => l_file,  
    11.                     buffer => l_buffer);  
    12.   dbms_output.put_line('after  get_line: current position is ' || utl_file.fgetpos(file => l_file));  
    13.   utl_file.fclose_all;  
    14.   
    15. 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 包含格式化字符[ %s]的内容。

       :代表一个换行符。

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

     

    完整例子程序:

    Sql代码  收藏代码
    1.     DECLARE  
    2.       l_loc         all_directories.directory_name%TYPE := 'CUX_LOG_DIR';  
    3.       l_file        utl_file.file_type;  
    4.       l_file_exsits BOOLEAN;  
    5.       l_file_length NUMBER;  
    6.       l_block_size  BINARY_INTEGER;  
    7.       l_buffer      VARCHAR2(32767);  
    8.                    
    9.       --data  
    10.       CURSOR c_hander IS  
    11.         SELECT fu.user_name, fu.description  
    12.           FROM fnd_user fu  
    13.          WHERE 1 = 1  
    14.            AND fu.user_name LIKE 'XXX%'  
    15.          ORDER BY fu.user_name;  
    16.        
    17.     BEGIN  
    18.       utl_file.fgetattr(location    => l_loc,  
    19.                         filename    => 'test.log',  
    20.                         fexists     => l_file_exsits,  
    21.                         file_length => l_file_length,  
    22.                         block_size  => l_block_size);  
    23.       --put  
    24.       IF l_file_exsits THEN  
    25.         l_file   := utl_file.fopen(location  => l_loc,  
    26.                                    filename  => 'test.log',  
    27.                                    open_mode => 'w');  
    28.       l_buffer := 'begining of file....';  
    29.       utl_file.put_line(file   => l_file,  
    30.                         buffer => l_buffer);  
    31.       FOR l IN c_hander LOOP  
    32.         l_buffer := l.user_name || chr(9) || nvl(l.description,  
    33.                                                  'no description');  
    34.         utl_file.put_line(file   => l_file,  
    35.                           buffer => l_buffer);  
    36.       END LOOP;  
    37.       l_buffer := 'end of file....';  
    38.       utl_file.put_line(file   => l_file,  
    39.                         buffer => l_buffer);  
    40.       
    41.       --flush  
    42.       utl_file.fflush(file => l_file);  
    43.       
    44.       --get  
    45.       l_file := utl_file.fopen(location  => l_loc,  
    46.                                filename  => 'test.log',  
    47.                                open_mode => 'r');  
    48.       
    49.       utl_file.fgetattr(location    => l_loc,  
    50.                         filename    => 'test.log',  
    51.                         fexists     => l_file_exsits,  
    52.                         file_length => l_file_length,  
    53.                         block_size  => l_block_size);  
    54.       
    55.       LOOP  
    56.         utl_file.get_line(file   => l_file,  
    57.                           buffer => l_buffer,  
    58.                           len    => 32767);  
    59.         dbms_output.put_line(a => l_buffer);  
    60.         
    61.         EXIT WHEN utl_file.fgetpos(file => l_file) = l_file_length;  
    62.       END LOOP;  
    63.       
    64.     END IF;  
    65.     utl_file.fclose_all;  
    66.   
    67. END;  

     


  • 相关阅读:
    前端职场的那些事情
    PS中的图像知识
    HTML5学堂,感谢您一年的陪伴(上)
    浏览器与HTML5的相辅相成
    当学习前端过程中心态发生了变化
    前端入门相关工具
    初学HTML5、初入前端
    前端开发工程师的发展方向
    关于元素水平垂直居中的那些事?
    便捷的前端开发工具
  • 原文地址:https://www.cnblogs.com/pekkle/p/6568717.html
Copyright © 2011-2022 走看看