您的位置:首页 > 数据库 > Oracle

Oracle的UTL_FILE.FOPEN的用法

2014-08-25 16:46 477 查看


racle提供的文件操作包UTL_FILE包中的UTL_FILE.FOPEN负责打开一个文件。

UTL_FILE.FOPEN(location in varchar2, filename in varchar2, open_mode in varchar2) return FILE_TYPE;

Location 是路径参数,

FILENAME 是文件名,

OPEN_MODE是打开模式,'R'是读文本,'W'是写文本,'A'是附加文本,参数不分大小写,如果指定'A'但是文件不存在,它会用'W'先创建出来,'W'有覆盖的功能;

其中的location并不能简单的指定为'D:/temp'等路径,要建立一个DIRECTORY变量并付给权限(必须以DBA身份登录):

Sql代码

create or replace directory D_OUTPUT as 'D:/TEMP' ;

grant read ,write on directory D_OUTPUT to testdb;

GRANT EXECUTE ON utl_file TO testdb;

[sql] view
plaincopy

create or replace directory D_OUTPUT as 'D:/TEMP';

grant read,write on directory D_OUTPUT to testdb;

GRANT EXECUTE ON utl_file TO testdb;

之后就可以用UTL_FILE包建立文件了

Sql代码

V_FILE UTL_FILE.FILE_TYPE;

V_FILE := UTL_FILE.FOPEN('D_OUTPUT' , 'Data.txt' , 'w' );

[sql] view
plaincopy

V_FILE UTL_FILE.FILE_TYPE;

V_FILE := UTL_FILE.FOPEN('D_OUTPUT', 'Data.txt', 'w');

就可以在数据库服务器的D:/TEMP建立Data.txt

最近用到了Oracle的包UTL_FILE,网上却没找到关于它的函数,过程使用说明,虽然都不是很难的东西,但简单列出来,也能提高些效率。

于是有了这篇文。

以下翻译来自《Oracle Built-in Packages》的第六章,只翻译了部分,想了解的更详细,请参考原文。http://www.oreilly.com/catalog/oraclebip/chapter/ch06.html

FOPEN

IS_OPEN

GET_LINE

PUT

NEW_LINE

PUT_LINE

PUTF

FFLUSH

FCLOSE

FCLOSE_ALL

UTL_FILE.FOPEN 用法

FOPEN会打开指定文件并返回一个文件句柄用于操作文件。

所有PL/SQL版本: Oracle 8.0版及以上:

FUNCTION UTL_FILE.FOPEN ( FUNCTION UTL_FILE.FOPEN (

location IN VARCHAR2, location IN VARCHAR2,

filename IN VARCHAR2, filename IN VARCHAR2,

open_mode IN VARCHAR2) open_mode IN VARCHAR2,

RETURN file_type; max_linesize IN BINARY_INTEGER)

RETURN file_type;

参数

location

文件地址

filename

文件名

openmode

打开文件的模式(参见下面说明)

max_linesize

文件每行最大的字符数,包括换行符。最小为1,最大为32767

3种文件打开模式:

R 只读模式。一般配合UTL_FILE的GET_LINE来读文件。

W 写(替换)模式。文件的所有行会被删除。PUT, PUT_LINE, NEW_LINE, PUTF和FFLUSH都可使用

A 写(附加)模式。原文件的所有行会被保留。在最末尾行附加新行。PUT, PUT_LINE, NEW_LINE, PUTF和FFLUSH都可使用

打开文件时注意以下几点:

文件路径和文件名合起来必须表示操作系统中一个合法的文件。

文件路径必须存在并可访问;FOPEN并不会新建一个文件夹。

如果你想打开文件进行读操作,文件必须存在;如果你想打开文件进行写操作,文件不存在时,会新建一个文件。

如果你想打开文件进行附加操作,文件必须存在。A模式不同于W模式。文件不存在时,会抛出INVALID_OPERATION异常。

FOPEN 会抛出以下异常

UTL_FILE.INVALID_MODE

UTL_FILE.INVALID_OPERATION

UTL_FILE.INVALID_PATH

UTL_FILE.INVALID_MAXLINESIZE

UTL_FILE.IS_OPEN 用法

如果文件句柄指定的文件已打开,返回TRUE,否则FALSE

FUNCTION UTL_FILE.IS_OPEN (file IN UTL_FILE.FILE_TYPE) RETURN BOOLEAN;

UTL_FILE只提供一个方法去读取数据:GET_LINE

UTL_FILE.GET_LINE 用法

读取指定文件的一行到提供的缓存。

PROCEDURE UTL_FILE.GET_LINE

(file IN UTL_FILE.FILE_TYPE,

buffer OUT VARCHAR2);

file

由FOPEN返回的文件句柄

buffer

读取的一行数据的存放缓存

buffer必须足够大。否则,会抛出VALUE_ERROR 异常。行终止符不会被传进buffer。

异常

NO_DATA_FOUND

VALUE_ERROR

UTL_FILE.INVALID_FILEHANDLE

UTL_FILE.INVALID_OPERATION

UTL_FILE.READ_ERROR

UTL_FILE.PUT 用法

在当前行输出数据

PROCEDURE UTL_FILE.PUT

(file IN UTL_FILE.FILE_TYPE,

buffer OUT VARCHAR2);

file

由FOPEN返回的文件句柄

buffer

包含要写入文件的数据缓存;Oracle8.0.3及以上最大允许32kB,早期版本只有1023B

UTL_FILE.PUT输出数据时不会附加行终止符。

UTL_FILE.PUT会产生以下异常

UTL_FILE.INVALID_FILEHANDLE

UTL_FILE.INVALID_OPERATION

UTL_FILE.WRITE_ERROR

UTL_FILE.NEW_LINE

在当前位置输出新行或行终止符,必须使用NEW_LINE来结束当前行,或者使用PUT_LINE输出带有行终止符的完整行数据。

PROCEDURE UTL_FILE.NEW_LINE

(file IN UTL_FILE.FILE_TYPE,

lines IN NATURAL := 1);

file

由FOPEN返回的文件句柄

lines

要插入的行数

如果不指定lines参数,NEW_LINE会使用默认值1,在当前行尾换行。如果要插入一个空白行,可以使用以下语句:

UTL_FILE.NEW_LINE (my_file, 2);

如果lines参数为0或负数,什么都不会写入文件。

NEW_LINE会产生以下异常

VALUE_ERROR

UTL_FILE.INVALID_FILEHANDLE

UTL_FILE.INVALID_OPERATION

UTL_FILE.WRITE_ERROR

例子

如果要在UTL_FILE.PUT后立刻换行,可以如下例所示:

PROCEDURE add_line (file_in IN UTL_FILE.FILE_TYPE, line_in IN VARCHAR2)

IS

BEGIN

UTL_FILE.PUT (file_in, line_in);

UTL_FILE.NEW_LINE (file_in);

END;

UTL_FILE.PUT_LINE

输出一个字符串以及一个与系统有关的行终止符

PROCEDURE UTL_FILE.PUT_LINE

(file IN UTL_FILE.FILE_TYPE,

buffer IN VARCHAR2);

file

由FOPEN返回的文件句柄

buffer

包含要写入文件的数据缓存;Oracle8.0.3及以上最大允许32kB,早期版本只有1023B

在调用UTL_FILE.PUT_LINE前,必须先打开文件。

UTL_FILE.PUT_LINE会产生以下异常

UTL_FILE.INVALID_FILEHANDLE

UTL_FILE.INVALID_OPERATION

UTL_FILE.WRITE_ERROR

例子

这里利用UTL_FILE.PUT_LINE从表emp读取数据到文件:

PROCEDURE emp2file

IS

fileID UTL_FILE.FILE_TYPE;

BEGIN

fileID := UTL_FILE.FOPEN ('/tmp', 'emp.dat', 'W');

/* Quick and dirty construction here! */

FOR emprec IN (SELECT * FROM emp)

LOOP

UTL_FILE.PUT_LINE

(TO_CHAR (emprec.empno) || ',' ||

emprec.ename || ',' ||

...

TO_CHAR (emprec.deptno));

END LOOP;

UTL_FILE.FCLOSE (fileID);

END;

PUT_LINE相当于PUT后加上NEW_LINE;也相当于PUTF的格式串"%s/n"。

UTL_FILE.PUTF

以一个模版样式输出至多5个字符串,类似C中的printf

PROCEDURE UTL_FILE.PUTF

(file IN FILE_TYPE

,format IN VARCHAR2

,arg1 IN VARCHAR2 DEFAULT NULL

,arg2 IN VARCHAR2 DEFAULT NULL

,arg3 IN VARCHAR2 DEFAULT NULL

,arg4 IN VARCHAR2 DEFAULT NULL

,arg5 IN VARCHAR2 DEFAULT NULL);

file

由FOPEN返回的文件句柄

format

决定格式的格式串

argN

可选的5个参数,最多5个

格式串可使用以下样式

%s

在格式串中可以使用最多5个%s,与后面的5个参数一一对应

/n

换行符。在格式串中没有个数限制

%s会被后面的参数依次填充,如果没有足够的参数,%s会被忽视,不被写入文件

UTL_FILE.PUTF会产生以下异常

UTL_FILE.INVALID_FILEHANDLE

UTL_FILE.INVALID_OPERATION

UTL_FILE.WRITE_ERROR

UTL_FILE.FFLUSH

确保所有数据写入文件。

PROCEDURE UTL_FILE.FFLUSH (file IN UTL_FILE.FILE_TYPE);

file

由FOPEN返回的文件句柄

操作系统可能会缓存数据来提高性能。因此可能调用put后,打开文件却看不到写入的数据。在关闭文件前要读取数据的话可以使用UTL_FILE.FFLUSH。

典型的使用方法包括分析执行进度和调试纪录。

UTL_FILE.FFLUSH会产生以下异常

UTL_FILE.INVALID_FILEHANDLE

UTL_FILE.INVALID_OPERATION

UTL_FILE.WRITE_ERROR

UTL_FILE.FCLOSE

关闭文件

PROCEDURE UTL_FILE.FCLOSE (file IN OUT FILE_TYPE);

file

由FOPEN返回的文件句柄

注意file是一个IN OUT参数,因为在关闭文件后会设置为NULL

当试图关闭文件时有缓存数据未写入文件,会抛出WRITE_ERROR异常

UTL_FILE.FCLOSE会产生以下异常

UTL_FILE.INVALID_FILEHANDLE

UTL_FILE.WRITE_ERROR

UTL_FILE.FCLOSE_ALL

关闭所有已打开的文件

PROCEDURE UTL_FILE.FCLOSE_ALL;

在结束程序时要确保所有打开的文件已关闭,可使用FCLOSE_ALL

也可以在EXCEPTION使用,当异常退出时,文件也会被关闭。

EXCEPTION

WHEN OTHERS

THEN

UTL_FILE.FCLOSE_ALL;

... other clean up activities ...

END;

注意:当使用FCLOSE_ALL关闭所有文件时,文件句柄并不会标记为NULL,使用IS_OPEN会返回TRUE。但是,那些关闭的文件不能执行读写操作(除非你再次打开文件)。

UTL_FILE.FCLOSE_ALL会产生以下异常

UTL_FILE.WRITE_ERROR
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: