设为首页 收藏本站
查看: 819|回复: 0

[经验分享] Oracle之UTL_FILE 包用法详解

[复制链接]

尚未签到

发表于 2016-8-4 12:45:39 | 显示全部楼层 |阅读模式
  UTL_FILE包可以用来读写操作系统上的文本文件,UTL_FILE提供了在客户端(FORM等等)和服务器端的文件访问功能。
创建测试目录:



  • 新建一个command window

  • 创建目录:(以system用户登录数据库)

SQL> create or replace directory cux_log_dir as '/home/appltest/debug';
Directory created


  • 赋权限。

SQL> grant read, write on directory cux_log_dir to public;
Grant succeeded

  



  • 检查目录是否成功创建
    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执行后,相关的文件则完全关闭了,测试:
DSC0000.png

结果为:
DSC0001.png


DSC0002.png

结果为:
DSC0003.png
 



  • 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,表示文件的末尾。
 
测试程序之前:
DSC0004.png

测试代码:
DSC0005.png

测试程序之后:
DSC0006.png

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



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

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没有打开,则会抛出异常。
测试:

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 从文本中读取一次的长度,默认是nulloracle就取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的值去代替。
 
完整例子程序:

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;
 
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-252765-1-1.html 上篇帖子: ORACLE中CONSTRAINT的四对属性 下篇帖子: oracle游标使用的方方面面
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表