1、登陆sys或者sysdate创建文件路径并授权给用户user_01
create directory FILEPATH as 'D:\test' --创建一个路径FILEPATH
grant read,write on directory FILEPATH to user_01; --给用户user_01授予路径读写的权限
2、在指定路径下创建文件夹(如:D:\test),并在该文件夹下面创建需要写入数据的文件(如:122.txt)
3、登陆被授予读写权限的用户,进行读写操作
DECLARE
l_file utl_file.file_type; --定义一个文件变量l_file,类型是file_type
BEGIN
l_file := utl_file.fopen('FILEPATH', '122.txt', 'W'); --给文件变量赋予一个初值122.txt,最后一个参数W表示写入
for i in
(select a.id||' '||a.name||' '||a.time result from table1 a);
loop
utl_file.put_line(l_file,i.result);
end loop;
utl_file.fclose(l_file);--关闭文件
END;
4、在文件122.txt中可查看写入的结果
5、知识点:UTL_FILE包
(1)UTL_FILE:是ORACLE提供的一个用来读写文件的标准工具包
(2)路径:使用包UTL_FILE读写操作系统的文件,首先需要创建路径(directory)并给用户授读写权限,ORACLE目录(路径)的作用就是让数据库与操作系统进行文件的交互;
创建目录(路径)的用户必须具有DBA角色或者被赋予CREATE ANY DIRECTORY权限,如果普通用户被赋予CREATE ANY DIRECTORY权限,那该用户就自动具备路径的读写权限;
创建路径:create directory FILEPATH as 'D:\test';
路径读写授权:grant read,write on directory FILEPATH to user_01;
utl_file包执行授权:grant execute on utl_file to user_01;
(3)file_type:UTL_FILE包中定义的记录类型,其成员是私有的,不能直接调用
(4)fopen:用于打开文件的函数,最多可以打开50个文件
语法:utl_file.fopen( location in varchar2, --文件路径,必须使用directory对象,且名称必须为大写
filename in varchar2,--文件名称
mode in varchar2,--打开模式
max_linesize in varchar2 --指定文件每行存放的最大字符数
);
return file_type;--返回预操作文件的指针(句柄)
注:打开模式有'w'、'r'、'a'、'wb'、'rb'、'ab'共6种
'w':写文件(文本),该文件不存在的话会自动创建,存在的话会覆盖原文件
'r':读文件(文本),该文件必须存在,否则会报错
'a':追加文件(文本),该文件若不存在,会以write模式创建此文件
带'b'后缀的为使用byte(字节)模式,BOLB和varchar2不一样,当文件为BOLB对象时,打开模式必须选择带'b'后缀的模式
(5) is_open:用于判断文件是否已打开的函数
utl_file.is_open(
file in file_type --指定文件的句柄
);
return boolean;--如果已经打开返回ture,否则返回fulse
(6)fclose:用于关闭已打开文件的函数
utl_file.fclose(file in\out file_type);
fclose_all:用于关闭当前所有打开文件的函数
utl_file.fclose_all;
(7)put_line:用于将文本缓冲区内容写入到文件中的函数,当使用该函数为文本追加内容时,会自动在文本的尾部追加行终止符
utl_file.put_line(
file in file_type,--文件指针(句柄)
buffer in varchar2,--指定存放数据的缓冲区
autoflush in boolean default false--指定是否自动刷新缓冲区数据
)
(8)get_line:用于读取已打开文件的行数据,行数据会被读取到输出缓冲区
- UTL_FILE.GET_LINE(
- file IN FILE_TYPE, -- 文件句柄
- buffer OUT VARCHAR2, -- 存储读取的Buff
- linesize IN NUMBER, -- 读取的最大字节数
- len IN PLS_INTEGER DEFAULT NULL -- 实际读取长度
- );
(9)get_raw:用于从文件中读取raw字符串,并调节文件指针到读取位置
- UTL_FILE.GET_RAW(
- fid IN UTL_FILE.TYPE, -- 文件句柄
- r OUT NOCOPY RAW, -- 读取的缓存Buff
- len IN PLS_INTEGER DEFAULT NULL -- 读取长度
- );
(10)put:将缓冲区中内容写入文件的函数,使用该函数时,文件必须以写模式打开
- UTL_FILE.PUT(
- file IN FILE_TYPE,
- buffer IN VARCHAR2
- );
(11)put_raw:将raw缓冲区中的内容写入文件的函数
utl_file.put_raw(
file in file_type,
r in raw,--指定存放raw数据的缓冲区
autoflush in boolean default false --指定是否自动刷新缓冲区数据
)
(12)new_line:为文件增加行终止符的函数
utl_file.new_line(
file in file_type,
lines in natrual :=1 --指定在文件中增加行终止符的个数
)
(13)fflush:强制将数据写入文件中的函数(正常情况下,给文件写入数据时,会将数据暂时先存放在缓冲区中)
utl_file.fflush(file in file_type)
(14)fremove:用于删除磁盘文件
utl_file.fremove(
location in varchar2, --指定路径,必须大写
filename in varchar2 --指定要删除的文件名
)
(15)fcopy:用于将源文件的全部或部分内容复制到目标文件中,在使用该函数的过程中,如果不设置起始行和结束行,将复制文件所有内容
UTL_FILE.FCOPY(
location IN VARCHAR2, -- 指定源DIRECTORY路径对象
filename IN VARCHAR2, -- 指定文件名
dest_dir IN VARCHAR2, -- 希望复制到的Directory路径对象
dest_file IN VARCHAR2, -- 复制后的文件名
start_line IN PLS_INTEGER default 1, -- 指定起始行号
end_line IN PLS_INTEGER default null -- 指定结束行号
);
(16)frename:用于修改已存在的文件名称
UTL_FILE.FRENAME(
location IN VARCHAR2,
filename IN VARCHAR2,
dest_dir IN VARCHAR2,
dest_file IN VARCHAR2,
overwrite IN BOOLEAN default false -- 是否覆盖已经存在的文件 );