Oracle之UTL_FILE包⽤法详解
UTL_FILE包可以⽤来读写操作系统上的⽂本⽂件,UTL_FILE提供了在客户端(FORM等等)和服务器端的⽂件访问功能。
创建测试⽬录:
新建⼀个command window;
创建⽬录:(以system⽤户登录数据库)
Sql代码收藏代码
SQL> create or replace directory cux_log_dir as '/home/appltest/debug';
Directory created
赋权限。
Sql代码收藏代码
SQL> grant read, write on directory cux_log_dir to public;
Grant succeeded
检查⽬录是否成功创建
Sql代码收藏代码
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就起作⽤了,例如在调试程序中,可以将调试的消息及时冲到⽂件中,已便于我们马上就能r 语法:
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  ⽂件系统块的字节⼤⼩。
测试:
Sql代码收藏代码
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,
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没有打开,则会抛出异常。
测试:
Sql代码收藏代码
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));    _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的值去代替。
完整例⼦程序:
Sql代码收藏代码
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;
exists的用法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,
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 ';
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 ';
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
_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;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。