Oracle之UTL_FILE 包用法详解
[转自] http://zhangzhongjie.iteye.com/blog/1903024
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执行后,相关的文件则完全关闭了,测试:

结果为:


结果为:

- 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 文件系统块的字节大小。
测试:
- 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
从文本中读取一次的长度,默认是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的值去代替。
完整例子程序:
- 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;
Oracle之UTL_FILE 包用法详解的更多相关文章
- Oracle之DBMS_LOCK包用法详解
概述与背景 某些并发程序,在高并发的情况下,必须控制好并发请求的运行时间和次序,来保证处理数据的正确性和完整性.对于并发请求的并发控制,EBS系统可以通过Concurrent Program定义界面的 ...
- Oracle之DBMS_SQL包用法详解
对于一般的(select)操作,如果使用动态的sql语句则需要进行以下几个步骤:open cursor--->parse---> bind variable ---> defi ...
- oracle正则表达式regexp_like的用法详解
oracle正则表达式regexp_like的用法详解 /*ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与IN ...
- golang格式化输出-fmt包用法详解
golang格式化输出-fmt包用法详解 注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org 声明: 此片文章并非原创,大多数内容都是来自:https:// ...
- Spring3.0.5jar包用法详解 [转载]
Spring3.X以后jar包进行了重构,取消了原来2.X版本中的总的spring.jar包,而是把总包中的功能全部分开打包.正在向osgi靠拢. 各个jar包详解如下: 1. org.springf ...
- java多线程管理 concurrent包用法详解
我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量 ...
- oracle add_months函数的用法详解
如果需要取上一个月的数据,并且每天都要进行此操作,每次都需要改时间,的确非常的麻烦,所以想到了oracle add_months函数这个函数 oracle add_months函数: oracle a ...
- Oracle DECODE函数的用法详解
Oracle DECODE函数使用方法: 1.比较大小select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值sign()函数根据某个值是0. ...
- Oracle Merge Into的用法详解
1. MERGE INTO 的用途 MERGE INTO 是Oracle 9i以后才出现的新的功能.那这个功能 是什么呢? 简单来说,就是:“有则更新,无则插入” ...
随机推荐
- Solidity mapping循环
https://medium.com/@blockchain101/looping-in-solidity-32c621e05c22
- Django框架 之 Auth用户认证
Django框架 之 Auth用户认证 浏览目录 auth模块 user对象 一.auth模块 1 from django.contrib import auth django.contrib.aut ...
- Mybaties原理图
- java IO Nio 文件拷贝工具类Files
public static void main(String[] args) throws Exception { Files.copy(Paths.get("file/text.txt&q ...
- DataTable与结构不同实体类之间的转换
在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实例化这个实体对象不就完了.的 ...
- [算法基础]Big O Notation时间复杂度计算方法
首先一点就是无视任何常量 从最简单的开始 statement; 这段时间复杂度为常数1,所以O(1). 然后 ; i < N; i++ ) statement; 这一段是线性的,则时间复杂度为N ...
- HDU - 1251 统计难题(trie树)
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部 ...
- 余额宝 vs. P2P网贷,谁更有生命力?
余额宝跟P2P网贷作为一个理财方式,要说谁更有生命力,那就必须从以下几个方面说起,一是收益性,二是风险性,三是流动性,下面从这几个方面来对比一下余额宝跟P2P网贷. 首先是收益性,作为投资理财者,第一 ...
- C#多线程编程实战1.5检测线程状态
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- ASP.NET MVC Controller 编程所涉及到的常用属性成员
Controller (System.Web.Mvc.Controller) 1.获取路由中的各个值 Request.RequestContext.RouteData.Values["id& ...