[转自] 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. Hyperledger Chaincode启动过程

    Chaincode 启动过程 简介 这里讲的 Chaincode 是用户链码(User Chaincode,UCC),对应用开发者来说十分重要,它提供了基于区块链分布式账本的状态处理逻辑,基于它可以开 ...

  2. El表达式 (先大致的记录下吧!以后慢慢深入)

    参考:http://blog.csdn.net/eson_15/article/details/51264269 1.获取数据采用 ${标识符} 的形式 request.setAttribute(&q ...

  3. selenium使用ChromeDriver

    什么是ChromeDriver? ChromeDriver是Chromium team开发维护的,它是实现WebDriver有线协议的一个单独的服务.ChromeDriver通过chrome的自动代理 ...

  4. HDU 3724 Encoded Barcodes (Trie)

    题意:给n个字符串,给m个询问,每个询问给k个条形码.每个条形码由8个小码组成,每个小码有相应的宽度,已知一个条形码的宽度只有2种,宽的表示1,窄的表示0.并且宽的宽度是窄的宽度的2倍.由于扫描的时候 ...

  5. Java 正则表达式的实际应用

    正则表达式最详细-----> | |目录 1匹配验证-验证Email是否正确 2在字符串中查询字符或者字符串 3常用正则表达式 4正则表达式语法 1匹配验证-验证Email是否正确 public ...

  6. Async异步委托

    /// <summary> /// 异步委托 /// </summary> public delegate void AsyncHandler(); public static ...

  7. const限定符、constexpr和常量表达式------c++ primer

    编译器将在编译过程中把用到const变量的地方都替换成对应的值,为了执行这种替换,编译器必须知道变量的初始值.如果程序包含多个文件,则那个用了const对象的文件都必须能访问到它的初始值才行.要做到这 ...

  8. java 列表与集合总结

    列表与集合 (一切输出都用for each!丢弃迭代器) 列表List 1 顺序表 Arraylist  适用于静态查找2   链式双向表 Linkedlist 适用于增删该查3 (容器) Vecto ...

  9. 强制json格式

  10. 【大数据系统架构师】0.1 Java编程基础

    1. 初识Java 2. Java语法 快速入门点我 2.1 数据类型和运算符 2.2 流程控制语句 2.3 数组 2.4 类和对象 2.5 OOP三大特性 2.6 集合框架与泛型 2.7 反射机制 ...