输出结果:
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
afterget_line: current position is 3
FREMOVE
描述:此procedure在你有充足的权限之下,删除一个磁盘上的文件。
语法:
UTL_FILE.FREMOVE ( location IN VARCHAR2,
filename IN VARCHAR2);
FRENAME
描述:此procedure将一个存在的文件重命名,类似unix命令:mv
语法:
UTL_FILE.FRENAME ( src_locationIN VARCHAR2,
src_filenameIN VARCHAR2,
dest_locationIN VARCHAR2,
dest_filename IN VARCHAR2,
overwriteIN BOOLEAN DEFAULT FALSE);
参数:介绍略。
GET_LINE
描述:此procedure从一个打开的文件中读取一行文本,直到遇到换行符。
语法:
UTL_FILE.GET_LINE ( fileIN FILE_TYPE,
buffer OUT VARCHAR2,
lenIN PLS_INTEGER DEFAULT NULL);
参数:len从文本中读取一次的长度,默认是null,就取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 ( fileIN FILE_TYPE,
bufferIN 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;