首页 > Linux操作系统 > Linux操作系统 > UTL_FILE包详解(第一篇)
Oracle的UTL_FILE包用来实现对磁盘文件的I/O操作。
(1)Oracle10g之前的版本需要指定utl_file包可以操作的目录。
方法:
1、alter system set utl_file_dir='e:/utl' scope=spfile;
2、在init.ora文件中,配置如下:UTL_FILE=E:/utl或者UTL_FILE_DIR=E:/utl;
(2)Oracle10g之后的版本,只需要先创建一个路径即可。
SELECT name FROM dba_dependencies WHERE referenced_name = 'UTL_FILE'
UNION
SELECT referenced_name FROM dba_dependencies WHERE name = 'UTL_FILE';
英文解释:
(1) Open a file for read operations
FOPEN会打开指定文件并返回一个文件句柄用于操作文件。
utl_file.fopen(
file_location IN VARCHAR2, --路径
file_name IN VARCHAR2, --文件名称
open_mode IN VARCHAR2, --打开模式 R 读 W 写 A 追加
max_linesize IN BINARY_INTEGER DEFAULT NULL)
RETURN file_type;
参数
location 文件地址
filename 文件名
openmode 打开文件的模式(参见下面说明)
3种文件打开模式:
(1)R 只读模式。一般配合UTL_FILE的GET_LINE来读文件。
(2)W 写(替换)模式。文件的所有行会被删除。
PUT, PUT_LINE, NEW_LINE, PUTF和FFLUSH都可使用。
(3)A 写(附加)模式。原文件的所有行会被保留。在最末尾行附加新行。
PUT, PUT_LINE, NEW_LINE, PUTF和FFLUSH都可使用
max_linesize 文件每行最大的字符数,包括换行符。最小为1,最大为32767。
打开文件时注意以下几点:
* 文件路径和文件名合起来必须表示操作系统中一个合法的文件。
* 文件路径必须存在并可访问;FOPEN并不会新建一个文件夹。
* 如果你想打开文件进行读操作,文件必须存在;如果你想打开文件进行写操作,文件不存在时,会新建一个文件。
* 如果你想打开文件进行附加操作,文件必须存在。A模式不同于W模式。文件不存在时,会抛出INVALID_OPERATION异常。
* FOPEN 会抛出以下异常
UTL_FILE.INVALID_MODE
UTL_FILE.INVALID_OPERATION
UTL_FILE.INVALID_PATH
UTL_FILE.INVALID_MAXLINESIZE
测试用例
DECLARE
v_output utl_file.file_type;
v_contxt VARCHAR2(250);
v_pathna varchar2(10);
BEGIN
v_pathna := 'utl_file_dir';
v_output:= utl_file.fopen(v_pathna, 'test.txt', 'R');
LOOP
BEGIN
utl_file.get_line(v_output, v_contxt);
dbms_output.put_line(v_contxt);
EXCEPTION
WHEN OTHERS THEN
EXIT;
END;
END LOOP;
utl_file.fclose(v_output);
END ;
/
(2) Open A File For Write Operations
英文解释:Returns True If A File Handle Is Open: Otherwise False
utl_file.is_open(file IN FILE_TYPE) RETURN BOOLEAN;
英文解释:Read a Line from a file
用法:
utl_file.getline(
file IN FILE_TYPE,
buffer OUT VARCHAR2,
len IN BINARY_INTEGER DEFAULT NULL);
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
--测试用例
DECLARE
v_output utl_file.file_type;
v_lntext VARCHAR2(250);
v_pathna VARCHAR2(200);
v_sql VARCHAR2(255);
BEGIN
v_pathna := 'UTL_FILE_DIR';
v_output := utl_file.fopen('UTL_FILE_DIR', 'test.txt', 'W');
FOR cour_b IN (SELECT a.owner || ',' || a.object_name || ',' ||
a.object_type || ',' || a.status AS column_text
FROM dba_objects a
WHERE a.owner = 'SCOTT') LOOP
v_sql := cour_b.column_text;
utl_file.putf(v_output, v_sql);
dbms_output.put_line(v_sql);
END LOOP;
IF (utl_file.is_open(v_output)) THEN
dbms_output.put_line('文件已经打开了');
--utl_file.put(v_output, 'aaaaaaaa');
ELSE
dbms_output.put_line('文件关闭');
END IF;
/* LOOP
BEGIN
utl_file.get_line(v_output, v_lntext);
dbms_output.put_line(v_lntext);
EXCEPTION
WHEN OTHERS THEN
EXIT;
END;
END LOOP;
*/
utl_file.fclose(v_output);
END fopen;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21835737/viewspace-760177/ ,如需转载,请注明出处,否则将追究法律责任。