UTL_FILE包可以用来读写操作系统上的文本文件,UTL_FILE提供了在客户端(FORM等等)和服务器端的文件访问功能。
创建测试目录:
新建一个command window;
创建目录:(以system用户登录数据库)
SQL> create or replace directory utl_dir as '/home/oracle';
Directory created.
$ cat abc.log
the begining of file
Hello World!
Thank you!
Bye!
SQL> grant read, write on directory cux_log_dir to public;
Grant succeeded
检查目录是否成功创建
select * FROM all_directories dir WHERE dir.DIRECTORY_NAME = 'CUX_LOG_DIR';
Ps:视图all_directories存放着我们能否访问的目录对象。如果要删除目录,也需用system用户登录数据库,执行如下命令:Drop directory cux_log_dir;
过程和函数
FOPEN
描述:打开一个文件,基本上在我们对文件进行读写动作之前都需要先执行这个function来打开文件先。
语法:
UTL_FILE.FOPEN ( location IN VARCHAR2,
filename IN VARCHAR2,
open_mode IN VARCHAR2,
max_linesize IN BINARY_INTEGER DEFAULT 1024) RETURN FILE_TYPE;
参数:location 略。
Filename 略。
open_mode 指明文件打开的模式。有如下几种
- r –只读(文本)
- w – 只写(本文)
- a – 追加(文本)
- rb – 只读(字节)
- wb – 只写(字节)
- ab – 追加(字节)
(注:当使用模式:a或者ab的时候,如果文件不存在,则会以write模式创建此文件)
max_linesize 指定文件文本每一行存放的最大字符数。
返回值:FOPEN返回一个接下来我们的程序将要使用到的文件的指针
FCLOSE
功能:关闭一个打开的文件。
语法:UTL_FILE.FCLOSE (file IN OUT FILE_TYPE);
参数:1. file->调用FOPEN或者FOPEN_NVCHAR返回的活动中的文件指针。
注意事项:当FCLOSE执行的时候,如果还有缓冲数据没有及时写入到文件中,那么程序就会raise一个异常:WRITE_ERROR。可以在PUT_LINE的时候加上参数autoflush => TRUE;或者在每次PUT之后执行:FFLUSH。
FCLOSE_ALL
功能:此procedure将会关闭本次session所有打开的文件。它用来紧急情况的清理功能,例如当PL/SQL程序在EXCEPTION部分退出时。
语法:UTL_FILE.FCLOSE_ALL;
注意事项:FCLOSE_ALL不会修改所打开的文件的状态,也就是说执行了FCLOSE_ALL后,再用IS_OPEN去检测文件,结果还是打开状态,但是之后,这些文件任然是不能去read或者write的。而FCLOSE执行后,相关的文件则完全关闭了,测试:
declare
l_loc VARCHAR2(100) :='UTL_DIR';
l_file utl_file.file_type;
l_buffer varchar2(1024);
begin
l_file := utl_file.fopen(location => l_loc,
filename => 'abc.log',
open_mode => 'R');
utl_file.fclose(file => l_file);
-- utl_file.fclose_all;
if utl_file.is_open(file => l_file) THEN
dbms_output.put_line('OPEN');
ELSE
dbms_output.put_line('CLOSE');
END IF;
utl_file.get_line(file => l_file, buffer=> l_buffer);
exception
when others then
dbms_output.put_line(SQLERRM);
end;
/
ClOSE
ORA-29282: invalid file ID
declare
l_loc VARCHAR2(100) :='UTL_DIR';
l_file utl_file.file_type;
l_buffer varchar2(1024);
begin
l_file := utl_file.fopen(location => l_loc,
filename => 'abc.log',
open_mode => 'R');
-- utl_file.fclose(file => l_file);
utl_file.fclose_all;
if utl_file.is_open(file => l_file) THEN
dbms_output.put_line('OPEN');
ELSE
dbms_output.put_line('CLOSE');
END IF;
utl_file.get_line(file => l_file, buffer=> l_buffer);
exception
when others then
dbms_output.put_line(SQLERRM);
end;
/
OPEN
ORA-29282: invalid file ID
FCOPY
功能:此procedure复制一个文件的连续部分内容或者全部内容到一个新创建的文件。如果参数start_line和end_line省略的话,默认地会复制整个文件。此操作会将源文件以read模式打开,将目标文件以write模式打开。
语法:
UTL_FILE.FCOPY ( src_location IN VARCHAR2,
src_filename IN VARCHAR2,
dest_location IN VARCHAR2,
dest_filename IN VARCHAR2,
start_line IN BINARY_INTEGER DEFAULT 1,
end_line IN BINARY_INTEGER DEFAULT NULL);
参数:src_location来源文件的目录名。取值来源是视图ALL_DIRECTORIES的DIRECTORY_NAME;
src_filename 将要被复制的来源文件
dest_location 被创建的目标文件存放的目录名。
dest_filename 从来源文件创建的目标文件。
start_line 要复制的内容起始行号,默认为1,表示从第一行开始复制。
end_line 要复制的内容的终止行号,默认NULL,表示文件的末尾。
测试程序之前:
$ cat abc.log
the begining of file
Hello World!
Thank you!
Bye!
测试代码:
declare
l_loc all_directories.directory_name%type := 'UTL_DIR';
BEGIN
utl_file.fcopy(src_location => l_loc,
src_filename => 'abc.log',
dest_location => l_loc,
dest_filename => 'efg.log',
start_line => 1,
end_line => 2);
exception
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
end;
/
测试程序之后:
[oracle@dbserver ~]$ cat efg.log
the begining of file
Hello World!
并且efg.log文件中的内容只有两行:
FFLUSH
描述:FFLUSH强制将缓冲的数据写入文件。因为通常待写入文件的数据都是都在缓冲存储位置。当有必要去read一个任然处于打开状态的文件时,FFLUSH就起作用了,例如在调试程序中,可以将调试的消息及时冲到文件中,已便于我们马上就能read这些内容。
语法:
UTL_FILE.FFLUSH (file IN FILE_TYPE);
FGETATTR
描述:FGETATTR读取磁盘上的文件并返回文件的属性。
语法:UTL_FILE.FGETATTR( location IN VARCHAR2,
filename IN VARCHAR2,
fexists OUT BOOLEAN,
file_length OUT NUMBER,
block_size OUT BINARY_INTEGER);
参数:location 此处略去X个字。
filename此处略去X个字。
fexists 返回的属性1:文件是否存在
file_length 返回的属性2:文件字节长度,如果文件不存在,则返回NULL。
block_size 文件系统块的字节大小。
测试:
DECLARE
l_loc all_directories.directory_name%TYPE := 'CUX_LOG_DIR';
l_file utl_file.file_type;
l_file_exsits BOOLEAN;
l_file_length NUMBER;
l_block_size BINARY_INTEGER;
l_buffer VARCHAR2(1024);
BEGIN
utl_file.fgetattr(location => l_loc,
filename => 'l001.log',
fexists => l_file_exsits,
file_length => l_file_length,
block_size => l_block_size);
IF l_file_exsits THEN
l_file := utl_file.fopen(location => l_loc,
filename => 'l001.log',
open_mode => 'R');
dbms_output.put_line('file exsits');
dbms_output.put_line('file length:' || l_file_length);
dbms_output.put_line('block sieze :' || l_block_size);
END IF;
utl_file.fclose_all;
END;
输出结果:
file exsits
file length:39802
block sieze :4096
FGETPOS
描述:此函数返回一个文件中当前的偏移位置。
语法:
UTL_FILE.FGETPOS (file IN FILE_TYPE) RETURN PLS_INTEGER;
注意事项:如果file没有打开,则会抛出异常。
测试:
declare
l_loc varchar2(100) := 'UTL_DIR';
l_file utl_file.file_type;
l_buffer VARCHAR2(1000);
begin
l_file := utl_file.fopen(location => l_loc,
filename => 'abc.log',
open_mode => 'R');
dbms_output.put_line('before get_line: current position is ' || utl_file.fgetpos(file => l_file));
utl_file.get_line(file => l_file, buffer => l_buffer);
dbms_output.put_line('after get_line: current position is ' || utl_file.fgetpos(file => l_file));
end;
/
before get_line: current position is 0
after get_line: current position is 21
PL/SQL procedure successfully completed.
FREMOVE
描述:此procedure在你有充足的权限之下,删除一个磁盘上的文件。
语法:
UTL_FILE.FREMOVE ( location IN VARCHAR2,
filename IN VARCHAR2);
FRENAME
描述:此procedure将一个存在的文件重命名,类似unix命令:mv
语法:
UTL_FILE.FRENAME ( src_location IN VARCHAR2,
src_filename IN VARCHAR2,
dest_location IN VARCHAR2,
dest_filename IN VARCHAR2,
overwrite IN BOOLEAN DEFAULT FALSE);
参数:介绍略。
GET_LINE
描述:此procedure从一个打开的文件中读取一行文本,直到遇到换行符。
语法:
UTL_FILE.GET_LINE ( file IN FILE_TYPE,
buffer OUT VARCHAR2,
len IN PLS_INTEGER DEFAULT NULL);
参数:len 从文本中读取一次的长度,默认是null,oracle就取FOPEN时的max_linesieze。
IS_OPEN
描述:顾名思义。
语法:UTL_FILE.IS_OPEN (file IN FILE_TYPE) RETURN BOOLEAN;
PUT
描述:PUT写入内容到文件中。(每写一次,不带换行符)
语法:UTL_FILE.PUT (file IN FILE_TYPE, buffer IN VARCHAR2);
PUT_LINE
描述:PUT_LINE写入内容到文件中。(每写一次,末尾都加一个换行符)
语法:
UTL_FILE.PUT_LINE ( file IN FILE_TYPE,
buffer IN VARCHAR2,
autoflush IN BOOLEAN DEFAULT FALSE);
测试
declare
l_loc varchar2(100) := 'UTL_DIR';
l_file utl_file.file_type;
l_buffer varchar2(1000);
begin
l_file := utl_file.fopen(location => l_loc,
filename => 'abc.log',
open_mode => 'r');
utl_file.get_line(file => l_file,
buffer => l_buffer);
dbms_output.put_line( l_buffer);
utl_file.fclose(file => l_file);
l_file := utl_file.fopen(location => l_loc,
filename => 'abc.log',
open_mode => 'A');
l_buffer := 'Add one more line!!!';
utl_file.put_line(file => l_file,
buffer => l_buffer);
utl_file.fclose(file => l_file);
end;
/
the begining of file
PL/SQL procedure successfully completed.
$ cat abc.log
the begining of file
Hello World!
Thank you!
Bye!
Add one more line!!!
PUTF
描述: 写入格式化的内容到文件中。好比C语言的printf()
语法:
UTL_FILE.PUTF ( file IN FILE_TYPE,
format IN VARCHAR2,
[arg1 IN VARCHAR2 DEFAULT NULL,
. . .
arg5 IN VARCHAR2 DEFAULT NULL]);
参数:format 包含格式化字符[\n,%s]的内容。
\n:代表一个换行符。
%s:用arg1~5的值去代替。
完整例子程序:
DECLARE
l_loc all_directories.directory_name%TYPE := 'CUX_LOG_DIR';
l_file utl_file.file_type;
l_file_exsits BOOLEAN;
l_file_length NUMBER;
l_block_size BINARY_INTEGER;
l_buffer VARCHAR2(32767);
--data
CURSOR c_hander IS
SELECT fu.user_name, fu.description
FROM fnd_user fu
WHERE 1 = 1
AND fu.user_name LIKE 'XXX%'
ORDER BY fu.user_name;
BEGIN
utl_file.fgetattr(location => l_loc,
filename => 'test.log',
fexists => l_file_exsits,
file_length => l_file_length,
block_size => l_block_size);
--put
IF l_file_exsits THEN
l_file := utl_file.fopen(location => l_loc,
filename => 'test.log',
open_mode => 'w');
l_buffer := 'begining of file....';
utl_file.put_line(file => l_file,
buffer => l_buffer);
FOR l IN c_hander LOOP
l_buffer := l.user_name || chr(9) || nvl(l.description,
'no description');
utl_file.put_line(file => l_file,
buffer => l_buffer);
END LOOP;
l_buffer := 'end of file....';
utl_file.put_line(file => l_file,
buffer => l_buffer);
--flush
utl_file.fflush(file => l_file);
--get
l_file := utl_file.fopen(location => l_loc,
filename => 'test.log',
open_mode => 'r');
utl_file.fgetattr(location => l_loc,
filename => 'test.log',
fexists => l_file_exsits,
file_length => l_file_length,
block_size => l_block_size);
LOOP
utl_file.get_line(file => l_file,
buffer => l_buffer,
len => 32767);
dbms_output.put_line(a => l_buffer);
EXIT WHEN utl_file.fgetpos(file => l_file) = l_file_length;
END LOOP;
END IF;
utl_file.fclose_all;
END;
参考至:http://blog.chinaunix.net/uid-7374279-id-3839512.html
http://www.cnblogs.com/advocate/archive/2011/02/18/1957540.html
http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm?bcsi_scan_7B0C6D5865CF5974=0&bcsi_scan_filename=u_file.htm#i1003796
如有错误,欢迎指正
邮箱:czmcj@163.com
相关推荐
UTL_FILE 用法详解 UTL_FILE 是 Oracle 数据库中提供的一个包,提供了在操作系统层面上对文件系统中文件的读写功能。非超级用户在使用 UTL_FILE 中任何函数或存储过程前必须由超级用户授予在这个包上的 EXECUTE ...
### Oracle UTL_FILE 包详解 #### 概述 `UTL_FILE`是Oracle数据库中一个重要的包,它提供了一套完整的文件输入/输出(I/O)操作接口,允许PL/SQL程序直接读写文件系统中的文件。这使得在Oracle环境中进行文件处理...
### UTL_MAIL与Oracle Scheduler详解 #### UTL_MAIL:Oracle中的邮件发送工具 UTL_MAIL是Oracle提供的一个用于发送电子邮件的内置程序包。通过UTL_MAIL,开发人员可以在Oracle环境中轻松实现邮件通知功能,这对于...
本文将深入探讨这一主题,包括UTL_FILE包的使用方法、相关函数和异常处理,以及如何创建存储过程来执行文件读写操作。 ### UTL_FILE包概述 UTL_FILE是Oracle提供的一个实用程序包,它允许用户在PL/SQL环境中访问和...
本文详细介绍了如何在Oracle数据库中创建目录、授予访问权限、使用`UTL_FILE`包来读取与写入文件的方法。通过这些技术,可以有效地提高Oracle数据库的灵活性和可扩展性,使得数据库开发人员能够在数据库层面轻松处理...
1. 使用UTL_FILE包: UTL_FILE是Oracle提供的一个内建包,用于读写操作系统文件。在描述的示例中,它被用来创建一个简单的CSV格式的文件,模拟Excel文件。以下是使用UTL_FILE创建Excel文件的基本步骤: ```sql ...
1. 原理说明:Oracle 调用 Webservice 使用 UTL_HTTP 包来实现对 Webservice 的调用。 2. Oracle 服务器端配置:需要在 Oracle 服务器端配置 UTL_HTTP 包的连接设置。 3. 加载 JAR 包:需要加载 Oracle 的 JDBC 驱动...
- **UTL_FILE**:文件I/O操作。 #### 结论 PL/SQL作为Oracle数据库的核心编程语言之一,为开发者提供了强大的工具来构建复杂且高性能的应用程序。通过掌握上述基本概念和技术要点,开发者可以更好地利用PL/SQL的...
4. **写入XML文件**:使用`UTL_FILE`包将格式化后的XML字符串写入指定目录下的文件中。 ```sql output_file := UTL_FILE.FOPEN('TEST_DIR', filename, 'w'); UTL_FILE.put(output_file, xmlstr); UTL_FILE....
- **电子邮件发送**:使用UTL_MAIL和UTL_SMTP包发送电子邮件。 - **Web I/O**:利用UTL_HTTP包进行HTTP请求,实现与Web服务的交互。 #### 七、全球化和本地化 - **字符集支持**:讨论了如何处理不同字符集的问题,...
此过程涉及Oracle数据库提供的多个包,如`UTL_SMTP`用于SMTP协议的交互、`UTL_FILE`用于文件读取等。 #### 核心知识点详解 ##### 存储过程定义 存储过程`PROCSENDEMAIL`被设计为接收多个参数,这些参数用于配置...
2. 在 PL/SQL 中使用 utl_http 包,构建 HTTP 请求并解析响应。 **解析** 解析返回的 XML 数据通常需要 XML 处理库,如 JDOM 或 DOM4J。在 Java 中,可以使用 JAXB 或 SAX 解析器将 XML 转换为 Java 对象;在 PL/...
- 使用 `utl_file.fopen` 打开指定目录下的文件,参数分别为:目录路径、文件名、文件模式(这里是写模式 `'w'`)。 3. **循环读取表数据并写入文件**: - 循环遍历游标 `c_bom` 返回的所有记录。 - 调用 `utl_...
### Oracle Logminer 使用和安装步骤详解 #### 一、Oracle Logminer 概述 Oracle Logminer 是一个强大的工具,用于挖掘 Oracle 数据库 Redo 日志中的数据更改信息。通过 Logminer,用户可以追踪数据库表的变化情况...
- **使用PL/SQL**:还可以使用PL/SQL包`UTL_FILE`来实现数据文件的写入。 示例代码: ```sql declare fp utl_file.file_type; begin fp := utl_file.fopen('c:\\oradata', 'tab1.txt', 'w'); utl_file.put_...
- `utlfile.ora`:这可能是UTL_FILE包的配置文件,定义了文件操作的一些设置。 - `cah.pkg`:未提供具体描述,可能包含自定义的PL/SQL功能或业务逻辑。 通过这些示例,初学者可以深入了解PL/SQL的语法、流程控制...
### ORACLE 表数据导出至TXT或CSV格式的存储过程详解 #### 一、背景与目的 在数据库管理工作中,经常会遇到需要将Oracle表中的数据导出为其他格式(如TXT、CSV)的需求,特别是在进行数据分析或者与其他系统进行...
### Oracle日志分析工具LogMiner使用详解 #### 一、概述 Oracle LogMiner是Oracle数据库提供的一个强大工具,用于分析重做日志文件,提取数据库中的更改记录(即SCN序列)。通过LogMiner,我们可以追踪并监控...
- **使用 PL/SQL 包导出数据**: ```plsql declare fp utl_file.file_type; begin fp := utl_file.fopen('c:\oradata','tab1.txt','w'); utl_file.putf(fp, '%s, %s\n', 'TextField', 55); utl_file.fclose(fp...