使用dbms_output输出有一个缺点是要到整个过程执行完毕才会把结果输出到屏幕,这样就无法在一个长时间运行的过程中通过dbms_output输出来随时监控执行状况。
为此可以使用utl_file包来输出文件。
utl_file.fopen 打开文件
utl_file.put_line 输出文件
utl_file.get_line 读取文件
utl_file.fclose 关闭文件
utl_file.fflush 强制输出缓冲
utl_file.fopen的第一个参数指定文件所在目录,这个目录必须包含在utl_file_dir参数指定的目录列表中,或者指定一个directory对象。否则fopen()会报错。
1)utl_file_dir
设置这个参数必须重起数据库,可以指定多个目录(用逗号隔开)。如果指定为*,表示任意目录。
alter system set utl_file_dir='u01Oracle','u02oracle' scope=spfile;
2)directory
创建一个directory对象并赋予所有用户读写权利
create or replace directory logfile_target as '/u01/oracle';
grant read,write on directory logfile_target to public;
察看已有的directory对象
select * from dba_directories;
3)使用utl_file包输出文件
DECLARE
l_file utl_file.file_type;
BEGIN
l_file := utl_file.fopen('LOGFILE_TARGET', 'sql.log', 'W');
for row in (select * from user_tables)
loop
utl_file.put_line(l_file, dbms_metadata.get_ddl('TABLE', row.table_name));
end loop;
utl_file.fclose(l_file);
END;
*这里也可以写成utl_file.fopen('/u01/oracle', 'sql.log', 'W');
*fopen()的第三个参数OPEN_MODE,可以指定为
r -- read text
w -- write text
a -- append text
rb -- read byte mode
wb -- write byte mode
ab -- append byte mode
如果指定'a'或者'ab'但是文件不存在会先创建。