热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle中utl_file包的使用

包UTL_FIle用于读写操作系统的文件,前提是首先创建Directory对象、授权。然后就可以使用UTL_FILE包中提供的类型、过程、函数来读

包UTL_FIle用于读写操作系统的文件,前提是首先创建Directory对象、授权。然后就可以使用UTL_FILE包中提供的类型、过程、函数来读

一、使用方法

包UTL_FIle用于读写操作系统的文件,前提是首先创建Directory对象、授权。然后就可以使用UTL_FILE包中提供的类型、过程、函数来读取,写入,操作目录中的文件了。

二、步骤

1、创建目录对象和授权

SQL> CREATE DIRECTORY CZW AS 'D:\';
Directory created
SQL> GRANT READ,WRITE ON DIRECTORY CZW TO SCOTT;
Grant succeeded
2、定义
h_file utl_file.file_type
3、使用
h_file = utl_file.fopen('SQL_TMP','tmp_rollback_tables','a');
utl_file.put_line(h_file,"strr");
utl_file.fclose(h_file);
三、UTL_FILE包中函数说明
1、FILE_TYPE
该类型是UTL_FILE包中定义的记录类型,其成员是私有的,不能够被直接引用。该类型的定义如下:
TYPE file_type IS RECORD(
id BINARY_INTEGER,datatype BINARY_INTEGER
);
2、FOPEN
该函数用于打开文件。使用这个函数最多可以打开50个文件,语法如下:
UTL_FILE.FOPEN(
location IN VARCHAR2,
filename IN VARCHAR2,
open_mode IN VARCHAR2,
max_linesize IN BINARY_INTEGER
)
RETURN file_type;
当成功的执行了该函数之后,就会返回文件句柄,访问该文件可以使用该文件句柄。如果执行失败的话,则会触发例外或者显示错误。注意,当指定文件位置的时候,必须要使用DIRECTORY对象,并且其名称必须为大写。示例如下:
DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BEGIN
HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);
DBMS_OUTPUT.PUT_LINE('D:\DYWT.TXT已经被打开');
END;

3、FOPEN_NCHAR
该函数用于以UNICODE方式打开文件。当使用该函数打开文件之后,读写文件会使用UNICODE取代数据库字符集。语法如下:
UTL_FILE.FOPEN_NCHAR(
location IN VARCHAR2,
filename IN VARCHAR2,
open_mode IN VARCHAR2,
max_linesize IN BINARY_INTEGER)
RETURN file_type;

4、IS_OPEN
该函数用于确定文件是否已经被打开,语法如下:
UTL_FILE.IS_OPEN(file IN FILE_TYPE) RETURN BOOLEAN;
如上所示,file用于指定文件句柄。如果文件已经被打开,则返回TRUE,否则则返回FALSE,该函数的示例如下:
DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BEGIN
IF NOT UTL_FILE.is_open(HANDLE) THEN
HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);
END IF;
DBMS_OUTPUT.PUT_LINE('D:\DYWT.TXT已经被打开');
END;

5、FCLOSE
该过程用于关闭已经打开的文件,语法如下:
UTL_FILE.FCLOSE(FILE IN OUT FILE_TYPE);

6、FCLOSE_ALL
该过程用于关闭当前打开的所有文件。语法如下:
UTL_FILE.FCLOSE_ALL;

7、GET_LINE
该过程用于从已经打开的文件中读取行内容,行内容会被读取到输出缓冲区。语法如下:
UTL_FILE.GET_LINE(
file IN FILE_TYPE,
buffer OUT VARCHAR2,
linesize IN NUMBER,
len IN PLS_INTEGER DEFAULT NULL
);
如上所示,buffer用于存储读取信息;linesize用于要指定读取的最大字节数;len用于指定实际读取的长度。使用该过程的示例如下:
DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BUFFER VARCHAR2(100);
BEGIN
IF NOT UTL_FILE.is_open(HANDLE) THEN
HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);
END IF;
UTL_FILE.GET_LINE(HANDLE,BUFFER,100);
DBMS_OUTPUT.PUT_LINE(BUFFER);
UTL_FILE.fclose(HANDLE);
END;

8、GET_LINE_NCHAR
该过程的用法同上面的是一样的,只不过是用UNICODE方式读取已经打开的文件的行内容,并且将行内容读取到输出缓冲区中。

9、GET_RAW
该过程用于从文件中读取RAW字符串,并调节文件指针到读取位置。语法如下:
UTL_FILE.GET_RAW(
fid IN UTL_FILE.TYPE,
r OUT NOCOPY RAW,
len IN PLS_INTEGER DEFAULT NULL
);
上面所示:fid用于指定文件的句柄,r用于取得读取信息,示例如下:
DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BUFFER VARCHAR2(2000);
BEGIN
IF NOT UTL_FILE.is_open(HANDLE) THEN
HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);
END IF;
UTL_FILE.GET_RAW(HANDLE,BUFFER,1000);
DBMS_OUTPUT.PUT_LINE(BUFFER);
UTL_FILE.fclose(HANDLE);
END;

10、PUT
该过程用于将缓冲区内容写入到文件中。当使用PUT过程的时候,文件必须以写方式打开,在写入缓冲区之后,如果要结束行,那么可以使用NEW_LINE过程。语法如下:
UTL_FILE.PUT(file IN FILE_TYPE,buffer IN VARCHAR2);
使用该过程的示例如下:
DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BUFFER VARCHAR2(2000);
BEGIN
IF NOT UTL_FILE.IS_OPEN(HANDLE) THEN
HANDLE := UTL_FILE.FOPEN('CZW','NEW.TXT','W',1000);
END IF;
BUFFER:='&CONTENT1';
UTL_FILE.PUT(HANDLE,BUFFER);
UTL_FILE.NEW_LINE(HANDLE);
BUFFER:='&CONTENT2';
UTL_FILE.PUT(HANDLE,BUFFER);
UTL_FILE.NEW_LINE(HANDLE);
UTL_FILE.FCLOSE(HANDLE);
END;

11、PUT_NCHAR
作用同上,该过程用于将缓冲区的内容以UNICODE方式写入到文件。

12、PUT_RAW
该过程用于将RAW缓冲区中的数据写入文件中。语法如下:
UTL_FILE.PUT_RAW(
fid IN UTL_FILE.FILE_TYPE,
R IN RAW,
autoflush IN BOOLEAN DEFAULT FALSE
)
上述,fid用于指定文件句柄,r用于指定存放RAW数据的缓冲区,autoflush用于指定是否自动刷新缓冲区数据.该过程的示例如下:

DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BUFFER VARCHAR2(2000);
BEGIN
IF NOT UTL_FILE.IS_OPEN(HANDLE) THEN
HANDLE := UTL_FILE.FOPEN('CZW','NEW.TXT','W',1000);
END IF;
BUFFER:='&CONTENT1';
UTL_FILE.PUT_RAW(HANDLE,BUFFER);
UTL_FILE.NEW_LINE(HANDLE);
UTL_FILE.FCLOSE(HANDLE);
END;

13、NEW_LINE
该过程用于为文件增加行终止符,语法如下:
UTL_FILE.NEW_LINE(file IN FILE_TYPE,lines IN NATURAL :=1);
后面的lines用于指定在文件中增加的行终止符的个数。

14、PUT_LINE
该过程用于将文本缓冲区内容写入到文件中。当使用该过程为文件追加内容时,会自动在文件的尾部追加行终止符。
DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BUFFER VARCHAR2(2000);
BEGIN
IF NOT UTL_FILE.is_open(HANDLE) THEN
HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','W',1000);
END IF;
BUFFER := '&CONTENT';
UTL_FILE.put_line(HANDLE,BUFFER);
UTL_FILE.fclose(HANDLE);
END;
注意:会删掉之前的数据,是在新写入的行后面增加一个行结束符。

15、PUT_LINE_NCHAR
同上,该过程用于将文本缓冲区内容以UNICODE方式写入文件。当使用该过程写入内容的时候,会自动的在尾部追加行终止符。
2012/12/31 13:50经过测试,会清空原有文件中的内容。

16、PUTF
该过程用于以特定的格式将文本内容写入到文件中,其中%s标识字符串,,格式\n表示行终止符。语法如下:
UTL_FILE.PUTF(
file IN FILE_TYPE,
format IN VARCHAR2,
[arg1 IN VARCHAR2 DEFAULT NULL,
...
arg5 IN VARCHAR2 DEFAULT NULL]);
上述format用于指定格式符(最多支持5个%s),arg1...arg5用于指定对应于格式符的字符串。使用该过程的示例如下:
DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BUFFER VARCHAR2(2000);
BEGIN
IF NOT UTL_FILE.is_open(HANDLE) THEN
HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','W',1000);
END IF;
UTL_FILE.PUTF(HANDLE,'%s\n%s\n%s\n','&line1','&line2','&line3');
UTL_FILE.FCLOSE(HANDLE);
END;

17、PUTF_NCHAR
同上,该过程用于以特定的格式将文本内容以UNICODE方式写入到文件中。

18、FFLUSH
该过程用于将数据强制性写入到文件中,正常情况下,当给文件写入数据的时候,数据会被暂时的放到缓存中。过程FFLUSH用于强制将数据写入到文件中。语法如下:
UTL_FILE.FFLUSH(file IN FILE_TYPE):

19、FSEEK
该过程用于移动文件指针到特定的位置。当使用该过程移动文件指针的时候,既可以指定文件指针的绝对位置,也可以指定文件指针的相对位置,语法如下:
UTL_FILE.FSEEK(
fid IN utl_file.FILE_TYPE,
absolute_offset IN PL_INTEGER DEFALUT NULL,
relative_offset IN PL_INTEGER DEFALUT NULL);
如上所示,absolute_offset 用于指定文件的绝对位置,relative_offset 用于指定文件的相对位置(单位:字节),使用该过程的示例如下:
DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BUFFER VARCHAR2(2000);
BEGIN
IF NOT UTL_FILE.is_open(HANDLE) THEN
HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);
END IF;
DBMS_OUTPUT.PUT_LINE('起始位置'||'==>'||UTL_FILE.FGETPOS(HANDLE));
UTL_FILE.fseek(HANDLE,5);
DBMS_OUTPUT.PUT_LINE('现在位置'||'==>'||UTL_FILE.FGETPOS(HANDLE));
UTL_FILE.FCLOSE(HANDLE);
END;

20、FREMOVE
该过程用于删除磁盘文件。语法如下:
UTL_FILE.FREMOVE(location IN VARCHAR2,filename IN VARCHAR2);
上面的location用于指定DIRECTORY,注意,这里也必须要大写,filename用于指定要删除的文件名,示例如下:
SQL> EXEC UTL_FILE.FREMOVE('CZW','NEW.TXT');
PL/SQL procedure successfully completed

21、FCOPY
该过程用于将源文件的全部或者部分内容复制到目标文件中。当使用该过程的时候,如果不设起始行和结束行,则将复制文件所有的内容。语法如下:
UTL_FILE.FCOPY(
location IN VARCHAR2,
filename IN VARCHAR2,
dest_dir IN VARCHAR2,
dest_file IN VARCHAR2,
start_line IN PLS_INTEGER DEFAULT 1,
end_line IN PLS_INTEGER DEFALUT NULL);
上面location用于指定源文件所在的DIRECTORY对象,filename用于指定具体的文件名字,dest_dir指定希望复制到的文件的directory对象,dest_file用于指定目标文件的名称,start_line用于指定起始行号,end_line用于指定结束行号。
下面是UTL_FILE.FCOPY的例子:
SQL> exec UTL_FILE.FCOPY('CZW','DYWT.TXT','CZW','CZW.TXT');
PL/SQL procedure successfully completed

22、FRENAME
该过程用于修改已经存在的文件名字,其作用于UNIX的MV命令完全相同,在修改文件名字的时候,通过指定overwrite参数可以覆盖已经存在的文件。语法如下:
UTL_FILE.FRENAME(
location IN VARCHAR2,
filename IN VARCHAR2,
dest_dir IN VARCHAR2,
dest_file IN VARCHAR2,
overwrite IN BOOLEAN DEFAULT FALSE);
上面的,overwrite用于指定是否要覆盖已经存在的文件(false 不覆盖,true可以覆盖)例子如下:
SQL> exec UTL_FILE.FRENAME('CZW','CZW.TXT','CZW','HANJB.TXT')
PL/SQL procedure successfully completed


推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
author-avatar
H_debug
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有