使用Oracle UTL_FILE包操作文件
本文档仅作为参考使用,如需要关于UTL_FILE包的官方详细描述,请点击这里,更多例子,请参考这里。
UTL_FILE封装了PL/SQL程序中对文件的操作,通常被用于PL/SQL程序的日志记录。
在使用之前,先必须确定好UTL_FILE包的参数设置是否正确,通常只需要设置‘utl_file_dir’参数就即可,‘utl_file_dir’定义了所操作文件的根目录。
检查参数
utl_file_dir的值可以有多个,设置多个目录时使用逗号分隔符,在使用fopen函数的时候必须指定其中任何一个目录即可,如果utl_file_dir只有一个可用目录,则不需要指定(见后面的例子)
设置参数
使用如下的命令重置utl_file_dir的值,指定你所需要的目录即可。
ALTER SYSTEM SET utl_file_dir='/tmp/','/oradata','/home/'
使用自定义目录
如果不使用utl_file_dir参数设置目录,也可是使用自定义目录来定义文件读写根目录,但必须对目录拥有相应的权限,如果没有则需要sysadm授权
CREATE DIRECTORY oraload AS 'c:\oraload\';
GRANT READ,WRITE ON DIRECTORY oraload TO UWCLASS;
常用方法
utl_file.fopen(file_location IN VARCHAR2, file_name IN VARCHAR2, open_mode IN VARCHAR2, max_linesize IN BINARY_INTEGER DEFAULT NULL) RETURN file_type;
fopen方法打开一个文件,函数返回类型为utl_file.file_type的文件句柄。
参数:
file_location:文件路径可以为utl_file_dir中的任何一个路径,或者使用自定义路径,在使用自定义路径或者utl_file_dir(value中只有一个路径)时,参数名必须大写。utl_file.fopen('ORALOAD', ...)
file_name:文件名
open_mode:文件打开模式,有一下几种
A:Append 文本
AB:Append字节
R:文本只读
RB:字节只读
W:文本写入
WB:字节写入
常用的为A、R、W
max_linesize:每行字符数的最大值,最小为1,最大为32767,默认使用1024
utl_file.get_line(file IN FILE_TYPE,buffer OUT VARCHAR2,len IN BINARY_INTEGER DEFAULT NULL);
getline方法从指定文件句柄中读取一行数据,可以指定每次读取内容的大小。
参数:
file:使用fopen打开的文件句柄
buffer:接受读取内容的缓存
len:读取内容的字节大小,默认将会使用最大值
UTL_FILE.PUT_LINE (file IN FILE_TYPE, buffer IN VARCHAR2, autoflush IN BOOLEAN DEFAULT FALSE);
向指定文件中写入一行内容。
参数:
file:要写入内容的目标文件句柄
buffer:需要写入的内容
autoflash:是否在write之后将内容从缓冲区写入磁盘
UTL_FILE.IS_OPEN (file IN FILE_TYPE) RETURN BOOLEAN;
用来判断指定文件句柄是否为open状态,返回类型为布尔值
UTL_FILE.FCLOSE (file IN OUT FILE_TYPE);
用来关闭一个已经打开的文件句柄,在使用完文件后,必须关闭文件句柄。
例子
下面这段代码讲会从指定文件中读取数据库表名,然后将表的部分信息以html格式输出到文件中。
1 /* 2 Before running this script, please use command 'show parameter utl_file' to check 'utl_file_dir' parameter, 3 and then set the v_log_path with one of the value of the 'utl_file_dir' values. Please inform your sysdba to 4 set the 'utl_file_dir' parameter. 5 */ 6 SET serveroutput ON; 7 DECLARE 8 v_log_path VARCHAR2(1000) DEFAULT '/usr/tmp'; 9 v_log_file_appender VARCHAR2(1000) DEFAULT ''; 10 v_health_check_tables_file utl_file.file_type; 11 v_health_check_file_name varchar2(100) default 'health_check_tables.txt'; 12 v_perf_log utl_file.file_type; 13 v_flag_column_info boolean default false; 14 15 v_table_name VARCHAR2(100) DEFAULT 'MTL_SYSTEM_ITEMS_B'; 16 v_data_vol_count NUMBER DEFAULT 0; 17 v_data_vol_query_str VARCHAR2(1000); 18 v_table_stats_record all_tables%rowtype; 19 v_table_stats_record_num NUMBER DEFAULT 0; 20 v_column_stats_record all_tab_columns%rowtype; 21 v_index_stats_record all_indexes%rowtype; 22 23 CURSOR v_cursor_column_rec(p_table_name VARCHAR2) IS 24 SELECT * FROM all_tab_columns WHERE table_name = p_table_name ORDER BY LAST_ANALYZED ASC; 25 26 CURSOR v_cursor_index_rec(p_table_name VARCHAR2) IS 27 select * from all_indexes where table_name = p_table_name order by last_analyzed asc; 28 BEGIN 29 v_log_file_appender := to_char(sysdate, 'yyyy-mm-dd') || '_' || to_char(sysdate, 'SSSSS'); 30 --open log file 31 v_perf_log := utl_file.fopen(v_log_path, 'pim_healthcheck_'|| v_log_file_appender ||'.html', 'A'); 32 IF (utl_file.is_open(v_perf_log)) THEN 33 v_health_check_tables_file := utl_file.fopen(v_log_path, v_health_check_file_name, 'R'); 34 end if; 35 36 loop 37 BEGIN 38 utl_file.get_line(v_health_check_tables_file, v_table_name); 39 v_table_name := REPLACE(v_table_name, chr(10), ''); 40 v_table_name := REPLACE(v_table_name, chr(13), ''); 41 v_table_name := upper(rtrim(ltrim(v_table_name))); 42 IF (v_table_name IS NOT NULL) THEN 43 utl_file.put_line(v_perf_log, '<h2>Table ' || v_table_name || '</h2>'); 44 -- data volumn check 45 v_data_vol_query_str := 'select count(*) from ' || v_table_name; 46 EXECUTE IMMEDIATE v_data_vol_query_str INTO v_data_vol_count; 47 utl_file.put_line(v_perf_log, 'The number of rows in table ' || v_table_name || ' is ' || to_char(v_data_vol_count)); 48 -- table static information 49 SELECT count(*) INTO v_table_stats_record_num FROM all_tables WHERE table_name = v_table_name; 50 utl_file.put_line(v_perf_log, '<table border=1>'); 51 utl_file.put_line(v_perf_log, '<tr><th>Last Analyze Date</th><th>NUM_ROWS</th><th>BLOCKS</th><th>AVG_ROW_LEN</th></tr>'); 52 IF (v_table_stats_record_num > 0) THEN 53 SELECT * INTO v_table_stats_record FROM all_tables WHERE table_name = v_table_name AND ROWNUM = 1; 54 utl_file.put_line(v_perf_log, '<tr>'); 55 utl_file.put_line(v_perf_log, '<td>' || to_char(v_table_stats_record.last_analyzed, 'yyyy/mm/dd HH24:MI:SS') || '</td>'); 56 IF (v_table_stats_record.num_rows < v_data_vol_count) THEN 57 utl_file.put_line(v_perf_log, '<td>' || to_char(v_table_stats_record.num_rows) || '</td>'); -- can mark alert info 58 ELSE 59 utl_file.put_line(v_perf_log, '<td>' || to_char(v_table_stats_record.num_rows) || '</td>'); 60 END IF; 61 utl_file.put_line(v_perf_log, '<td>'||to_char(v_table_stats_record.BLOCKS)||'</td>'); 62 utl_file.put_line(v_perf_log, '<td>'||to_char(v_table_stats_record.avg_row_len)||'</td>'); 63 utl_file.put_line(v_perf_log, '</tr>'); 64 END IF; 65 utl_file.put_line(v_perf_log, '</table>'); 66 -- table definition area 67 --1. column definition 68 IF (v_flag_column_info) THEN 69 utl_file.put_line(v_perf_log, '<h3>Column information</h3>'); 70 utl_file.put_line(v_perf_log, '<table border=1>'); 71 utl_file.put_line(v_perf_log, '<tr><th>COLUMN_NAME</th><th>DATA_TYPE</th><th>DATA_LENGTH</th><th>LAST_ANALYZED</th></tr>'); 72 OPEN v_cursor_column_rec(v_table_name); 73 loop 74 fetch v_cursor_column_rec INTO v_column_stats_record; 75 utl_file.put_line(v_perf_log, '<tr>'); 76 utl_file.put_line(v_perf_log, '<td>'||to_char(v_column_stats_record.COLUMN_NAME)||'</td>'); 77 utl_file.put_line(v_perf_log, '<td>'||to_char(v_column_stats_record.DATA_TYPE)||'</td>'); 78 utl_file.put_line(v_perf_log, '<td>'||to_char(v_column_stats_record.DATA_LENGTH)||'</td>'); 79 utl_file.put_line(v_perf_log, '<td>'||to_char(v_column_stats_record.LAST_ANALYZED)||'</td>'); 80 utl_file.put_line(v_perf_log, '</tr>'); 81 exit when v_cursor_column_rec%NOTFOUND; 82 END loop; 83 CLOSE v_cursor_column_rec; 84 end if; 85 -- 2. index information 86 utl_file.put_line(v_perf_log, '<h3>Index information</h3>'); 87 utl_file.put_line(v_perf_log, '<table border=1>'); 88 utl_file.put_line(v_perf_log, '<tr><th>INDEX_NAME</th><th>INDEX_TYPE</th><th>LAST_ANALYZED</th><th>NUM_ROWS</th></tr>'); 89 OPEN v_cursor_index_rec(v_table_name); 90 loop 91 fetch v_cursor_index_rec INTO v_index_stats_record; 92 utl_file.put_line(v_perf_log, '<tr>'); 93 utl_file.put_line(v_perf_log, '<td>'||to_char(v_index_stats_record.INDEX_NAME)||'</td>'); 94 utl_file.put_line(v_perf_log, '<td>'||to_char(v_index_stats_record.INDEX_TYPE)||'</td>'); 95 utl_file.put_line(v_perf_log, '<td>'||to_char(v_index_stats_record.LAST_ANALYZED)||'</td>'); 96 utl_file.put_line(v_perf_log, '<td>'||to_char(v_index_stats_record.NUM_ROWS)||'</td>'); 97 utl_file.put_line(v_perf_log, '</tr>'); 98 exit when v_cursor_index_rec%NOTFOUND; 99 END loop; 100 utl_file.put_line(v_perf_log, '</table>'); 101 CLOSE v_cursor_index_rec; 102 end if; 103 exception 104 WHEN NO_DATA_FOUND THEN 105 exit; 106 END; 107 end loop; 108 109 utl_file.fclose(v_perf_log); 110 utl_file.fclose(v_health_check_tables_file); 111 EXCEPTION 112 WHEN UTL_FILE.INVALID_PATH THEN 113 -- error during opening log file 114 dbms_output.put_line('Error: please check your "utl_file_dir" setting first.'); 115 WHEN OTHERS THEN 116 IF (utl_file.is_open(v_perf_log)) THEN 117 -- close file if there is any exception; 118 utl_file.fclose(v_perf_log); 119 END IF; 120 IF (utl_file.is_open(v_health_check_tables_file)) THEN 121 utl_file.fclose(v_health_check_tables_file); 122 end if; 123 END;
文件health_check_tables.txt的格式为:Table_Name_ATable_Name_B
转载于:https://www.cnblogs.com/fanzaoyang/archive/2012/08/30/oracle_utl_file_package_introduce.html
使用Oracle UTL_FILE包操作文件相关推荐
- 利用UTL_FILE包实现文件I/O操作
摘要:本文主要讨论如何利用Oracle的UTL_FILE包来实现对磁盘文件的I/O操作. 文件I/O对于数据库的开发来说显得很重要,比如如果数据库中的一部分数据来自于磁盘文件,那么就需要使用I/O接口 ...
- mysql utl_file_利用UTL_FILE包实现文件I/O操作
摘要:本文主要讨论如何利用Oracle的UTL_FILE包来实现对磁盘文件的I/O操作. 文件I/O对于数据库的开发来说显得很重要,比如如果数据库中的一部分数据来自于磁盘文件,那么就需要使用I/O接口 ...
- Oracle - UTL_FILE包之详解
一.说明 UTL_FILE是oracle提供的一个标准的工具包,用来读写文件使用. 二.路径 包UTL_FILE用于读写操作系统的文件,前提是首先创建路径(Dire ...
- oracle读写文件--利用utl_file包对磁盘文件的读写操作
oracle读写文件--利用utl_file包对磁盘文件的读写操作 摘要: 用户提出一个需求,即ORACLE中的一个表存储了照片信息,字段类型为BLOB,要求能导出成文件形式. 本想写个C#程序来做, ...
- 用两种不同的方法导出ORACLE 查询数据为CSV 文件 (python 代码 与 使用 utl_file 包)
因要对客户发送一些推广邮件,需要把email导出到csv,再使用专门邮件发送软件进行发送. 在使用ORACLE 的 utl_file 包,把数据写到文件中. 看到是逐条数据写入文件.速度比较慢.所以想 ...
- oracle 导出数据 utl,【原创】利用utl_file包进行表数据导出
利用utl_file包进行表数据导出 2013/11/12 一.概述 工作中需要将许多表的数据导出到一份excel中,虽然PL/SQL自带有导出的功能,但是导出后需要进行手动的汇总到一张excel中, ...
- oracle utl_file fcopy,ORACLE之UTL_FILE包详解
1 Utl_File包简介 Oracle的UTL_FILE包用来实现对磁盘文件的I/O操作. (1)Oracle10g之前的版本需要指定utl_file包可以操作的目录. 方法: 1.alter sy ...
- oracle utl_file权限,Oracle内建包UTL_FILE使用说明
在数据库的开发中,当PL/SQL语句很复杂的时候,我想写一些Log,就像java的Log4j那样.这样就可以很好的跟踪程序的运行情况.在网上找到的文章不是很好用,修改了一下. 1:在Oracle服务器 ...
- Oracle之UTL_FILE 包用法例子
A.说明 UTL_FILE是oracle提供的一个标准的工具包,用来读写文件使用. B.创建路径 包UTL_FILE用于R.W.操作系统的文件,首先创建路径(Directory)并授权.ORACLE目 ...
最新文章
- hdu 5059 判断数字表示方式以及范围合法(int型之内)
- 套接字选项SO_LINGER
- 大话数据结构15 : 线索二叉树
- Web 前端框架分类解读
- Flask 从入门到熟悉(不敢称为精通)
- C++实现双栈结构(一个顺序表中使用两个栈)
- 信息学奥赛一本通 1312:【例3.4】昆虫繁殖
- 从ca提取keystore_从keystore(jks)文件中提取私钥
- 数字图像识别笔记(第三章-灰度变换与空间滤波)
- (暴力求解)百钱买百鸡问题升级版
- 用三层交换机实现大中型企业VLAN
- 闫墨杰415知识点总结
- 案例7-2 寻找大富翁 (25 分)(STL容器)
- 51单片机毕业设计题目大全
- 美国薪资最高的技术技能:Golang、Kafka、DynamoDB、Redshift、Cassandra
- 打飞机小游戏html代码,纯汇编实现打飞机小游戏的示例代码
- Win10 屏幕保护突然不出现怎么办
- C语言 模拟按键操作
- C++智能指针之01
- 有个程序猿很忧桑:一个命令rm -rf/ ,他把整个公司删没了
热门文章
- C++中extern “C”含义深层探索
- 真不知写什么了,也就是很久没有做什么了
- 3.14-19 wc、iconv、dos2unix、diff、vimdiff、rev
- java ref 应用类型_Java中的四种引用类型比较
- 重启大法好!线上常见问题排查手册
- 文件按m3u8顺序合并_在线视频下载之m3u8篇
- 非人哉恰饭的九月最美丽,只有啸天是菜鸡,上班睡觉太厉害了
- Hadoop快速入门——第一章、认识Hadoop
- JavaWeb课程复习资料(四)——创建Servlet
- 【蓝桥杯Java_C组·从零开始卷】第五节(二)、BigDecimal的使用