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

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

创建测试目录:

  1. 新建一个command
    window;
  2. 创建目录:(以system用户登录数据库)
  1. SQL> create or replace directory cux_log_dir as '/home/appltest/debug';
  2. Directory created
  1. 赋权限。
  1. SQL> grant read, write on directory cux_log_dir to public;
  2. Grant succeeded
  1. 检查目录是否成功创建

    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_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文件中的内容只有两行:

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

测试:

  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. l_file := utl_file.fopen(location  => l_loc,
  16. filename  => 'l001.log',
  17. open_mode => 'R');
  18. dbms_output.put_line('file exsits');
  19. dbms_output.put_line('file length:' || l_file_length);
  20. dbms_output.put_line('block sieze :' || l_block_size);
  21. END IF;
  22. utl_file.fclose_all;
  23. END;

输出结果:

file exsits

file length:39802

block sieze :4096

  1. FGETPOS

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

语法:

UTL_FILE.FGETPOS (file IN FILE_TYPE) RETURN PLS_INTEGER;

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

测试:

  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. 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
从文本中读取一次的长度,默认是null,oracle就取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的值去代替。

完整例子程序:

  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. --data
  9. CURSOR c_hander IS
  10. SELECT fu.user_name, fu.description
  11. FROM fnd_user fu
  12. WHERE 1 = 1
  13. AND fu.user_name LIKE 'XXX%'
  14. ORDER BY fu.user_name;
  15. BEGIN
  16. utl_file.fgetattr(location    => l_loc,
  17. filename    => 'test.log',
  18. fexists     => l_file_exsits,
  19. file_length => l_file_length,
  20. block_size  => l_block_size);
  21. --put
  22. IF l_file_exsits THEN
  23. l_file   := utl_file.fopen(location  => l_loc,
  24. filename  => 'test.log',
  25. open_mode => 'w');
  26. l_buffer := 'begining of file....';
  27. utl_file.put_line(file   => l_file,
  28. buffer => l_buffer);
  29. FOR l IN c_hander LOOP
  30. l_buffer := l.user_name || chr(9) || nvl(l.description,
  31. 'no description');
  32. utl_file.put_line(file   => l_file,
  33. buffer => l_buffer);
  34. END LOOP;
  35. l_buffer := 'end of file....';
  36. utl_file.put_line(file   => l_file,
  37. buffer => l_buffer);
  38. --flush
  39. utl_file.fflush(file => l_file);
  40. --get
  41. l_file := utl_file.fopen(location  => l_loc,
  42. filename  => 'test.log',
  43. open_mode => 'r');
  44. utl_file.fgetattr(location    => l_loc,
  45. filename    => 'test.log',
  46. fexists     => l_file_exsits,
  47. file_length => l_file_length,
  48. block_size  => l_block_size);
  49. LOOP
  50. utl_file.get_line(file   => l_file,
  51. buffer => l_buffer,
  52. len    => 32767);
  53. dbms_output.put_line(a => l_buffer);
  54. EXIT WHEN utl_file.fgetpos(file => l_file) = l_file_length;
  55. END LOOP;
  56. END IF;
  57. utl_file.fclose_all;
  58. END;

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

  1. Oracle之DBMS_LOCK包用法详解

    概述与背景 某些并发程序,在高并发的情况下,必须控制好并发请求的运行时间和次序,来保证处理数据的正确性和完整性.对于并发请求的并发控制,EBS系统可以通过Concurrent Program定义界面的 ...

  2. Oracle之DBMS_SQL包用法详解

    对于一般的(select)操作,如果使用动态的sql语句则需要进行以下几个步骤:open  cursor--->parse---> bind  variable  ---> defi ...

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

    oracle正则表达式regexp_like的用法详解 /*ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与IN ...

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

    golang格式化输出-fmt包用法详解 注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org    声明: 此片文章并非原创,大多数内容都是来自:https:// ...

  5. Spring3.0.5jar包用法详解 [转载]

    Spring3.X以后jar包进行了重构,取消了原来2.X版本中的总的spring.jar包,而是把总包中的功能全部分开打包.正在向osgi靠拢. 各个jar包详解如下: 1. org.springf ...

  6. java多线程管理 concurrent包用法详解

        我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量 ...

  7. oracle add_months函数的用法详解

    如果需要取上一个月的数据,并且每天都要进行此操作,每次都需要改时间,的确非常的麻烦,所以想到了oracle add_months函数这个函数 oracle add_months函数: oracle a ...

  8. Oracle DECODE函数的用法详解

    Oracle DECODE函数使用方法: 1.比较大小select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值sign()函数根据某个值是0. ...

  9. Oracle Merge Into的用法详解

    1.    MERGE INTO 的用途         MERGE INTO 是Oracle 9i以后才出现的新的功能.那这个功能 是什么呢?         简单来说,就是:“有则更新,无则插入” ...

随机推荐

  1. 【Leetcode009】Palindrome Number

    问题链接:https://leetcode.com/problems/palindrome-number/#/description Question:Determine whether an int ...

  2. Luogu 3646 [APIO2015]巴厘岛的雕塑

    初赛成绩出了,和预想的一样,一分都没挂,开心. 大佬的博客 subtask 1 ($n \leq 200$) 因为高位取$0$一定比高位取$1$优,我们考虑按照位从高到低进行检验,设$f_{i, j} ...

  3. 面试题:测试给定的list,使用for,foreach,iterator删除元素的不同表现

    上代码: 1. 使用增强for循环(foreach) package com.xxx; import java.util.ArrayList; import java.util.List; /** * ...

  4. Sharepoint2013搜索学习笔记之设置外网内容源(四)

    第一步,进入管理中心,点击管理应用程序,点击search service 应用程序进入到搜索管理配置页面,选择内容源 第二步,点击新建内容源,给内容源命名,在爬网内容类型中选网站,在爬网设置中选中仅对 ...

  5. C#向服务器上传文件问题

    最近在写服务器端web上传的接口.但一直报错,上传不上去,后来发现是在分隔符中出现的问题. 错误的写法: var boundary = "---------------" + Da ...

  6. 基于任务的异步编程模式(TAP)

    异步编程是C#5.0的一个重要改进,提供两个关键字:async和await.使用异步编程,方法的调用是在后台运行(通常在线程或任务的帮助下),但不会阻塞调用线程.异步模式分为3种:异步模式.基于事件的 ...

  7. Java读写配置文件prop.properties

    Java读写配置文件prop.properties @Test public void fun() throws IOException{ Properties prop=new Properties ...

  8. 【微服务】之七:轻松搞定SpringCloud微服务-API权限控制

    权限控制,是一个系统当中必须的重要功能.张三只能访问输入张三的特定功能,李四不能访问属于赵六的特定菜单.这就要求对整个体系做一个完善的权限控制体系.该体系应该具备针区分用户.权限.角色等各种必须的功能 ...

  9. 《 V I M 教 程 》 —— 版本 1.7

    =============================================================================== = 欢 迎 阅 读 < V I M ...

  10. 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )

    数据结构实验之图论七:驴友计划 Time Limit: 1000 ms           Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...