I.设置路径utl_file_dir
第一步:以管理员用户登陆
如:conn sys/password@sid as sysdba
第二步:设置可操作目录
需要指定utl_file包可以操作的目录。在oracle 10g以前,可以用以下方法:
1、alter system set utl_file_dir='e:/utl' scope=spfile;
2、在init.ora文件中,配置如下:
UTL_FILE=E:/utl或者UTL_FILE_DIR=E:/utl
在oracle 10g中建议用以下方法配置:CREATE DIRECTORY utl AS 'E:/utl';
第三步:授权给指定用户,以便执行utl_file
GRANT EXECUTE ON utl_file TO scott;
第四步:conn scott/tiger
就可以正常使用utl_file了。
II.包说明
1.方法说明
2.步骤:
1)声明一个文件句柄变量,以便调用utl_file例程时使用它标识文件。可以使用utl_file.file_type类型声明文件句柄变量。
2)声明一个varchar2类型的字符串,作为一次读取文件中一行的缓冲区。
3)调用utl_file.fopen打开文件或者采用utl_file.fopen_nchar以unicode方式打开文件。打开文件时需要指定是读还是写文件,不能够既读又写文件。
4)如果读取文件,则调用utl_file.get_line或者get_line_nchar过程;如果是写文件则调用utl_file.put_line或者put_line_nchar过程。
5)完成操作后,调用utl_file.fclose关闭文件。
3.可能产生的异常
4.部分方法说明
a.fopen
function fopen(location in varchar2,
filename in varchar2,
open_mode in varchar2,
max_linesize in binary_integer) return file_type;
要打开的文件目录路径必须存在,否则fopen不会自动创建。
location:文件目录的路径。如果该目录与可访问目录表中的目录不匹配,则引发异常utl_file.invalid_path
filename:文件名.
open_mode:'r'读文本,‘W’写文本,‘A’追加文本,大小写不敏感。 当为A时如果文件不存在,则按W方式创建新文件。
max_linesize:文件的最大行数,1-32767,如果没有该参数,则为1024,如果值不在1-32767之间,引发utl_file.invalid_maxlinesize异常
返回值:返回值为utl_file.file_type类型。后续函数使用的文件句柄。
b.putf
putf(file_handle in file_type,
format invarchar2,
arg1 in varchar2 default null,arg2 in varchar2 default null,....)
可以格式化文本format.
如:
utl_file.putf(v_file,'Hi there!/nMy name is %s,and I am a %s major./n','Scott','Comput');
/n:换行符,%s用后面参数一一对应来替换
c.fflush
fflush(file_handle in file_type);
一般向文件传输数据时通常是存储在缓冲区中的,当该缓冲区满后,才被送往输出文件,fflush强行把缓冲区中的字段立即定稿指定文件,只把以new_line字符结尾的行写入文件中,put操作的字符都将在缓冲区保留。
5.例子
CREATE OR REPLACE PROCEDURE p_utl_file(p_str VARCHAR2 DEFAULT NULL) AS
/*
*/
--定义文件句柄
v_file utl_file.file_type;
BEGIN
--打开文件
v_file:=utl_file.fopen('e:/test/utl','testutl.txt','a',32767);
--将内容写入文件
utl_file.put(v_file,p_str);
utl_file.new_line(v_file,1);
--缓存未满,上面内容未写入文件,单步调用时可以看到这点
--fflush强制将new_line结束的内容写入文件
utl_file.fflush(v_file);
--文件中已经有上一步的内容
utl_file.put_line(v_file,p_str||'1');
utl_file.fclose(v_file);
EXCEPTION
WHEN OTHERS THEN
NULL;
END p_utl_file;