对于文件系统上目录的引用是通过使用目录名称,或者由CREATEDIRECTORY命令为目录分配的化名来实现的。
UTL_FILE常用方法:
FOPEN
IS_OPEN
GET_LINE
PUT
NEW_LINE
PUT_LINE
PUTF
FFLUSH
FCLOSE
FCLOSE_ALL
FRENAME
FREMOVE
FFLUSH
FCOPY
UTL_FILE.FOPEN 用法
适用范围:
函数原型:
参数
打开文件时注意以下几点:
UTL_FILE.IS_OPEN用法
函数原型:
UTL_FILE.GET_LINE用法
函数原型:
参数说明:
异常:
UTL_FILE.PUT用法
函数原型:
参数说明:
UTL_FILE.PUT输出数据时不会附加行终止符。
异常:
UTL_FILE.NEW_LINE
函数原型:
参数说明:
注意:
异常:
例子:
如果要在UTL_FILE.PUT后立刻换行,可以如下例所示:
PROCEDURE add_line (file_in IN UTL_FILE.FILE_TYPE, line_in INVARCHAR2)
IS
BEGIN
END;
UTL_FILE.PUT_LINE
函数原型:
参数说明:
注意:
异常:
例子:
这里利用UTL_FILE.PUT_LINE从表emp读取数据到文件:
PROCEDURE emp2file
IS
BEGIN
END;
PUT_LINE相当于PUT后加上NEW_LINE;也相当于PUTF的格式串"%s\n"。
UTL_FILE.PUTF
函数原型:
PROCEDURE UTL_FILE.PUTF
参数说明:
异常:
UTL_FILE.FFLUSH
函数原型:
参数说明:
注意:
异常:
UTL_FILE.FCLOSE
函数原型:
参数说明:
注意:
异常:
UTL_FILE.FCLOSE_ALL
原型:
在结束程序时要确保所有打开的文件已关闭,可使用FCLOSE_ALL
也可以在EXCEPTION使用,当异常退出时,文件也会被关闭。
EXCEPTION
THEN
END;
注意:
异常:
UTL_FILE.FCOPY
函数原型:
FCOPY(location VARCHAR2, filename VARCHAR2,dest_dir VARCHAR2, dest_file VARCHAR2[, start_line PLS_INTEGER [, end_line PLS_INTEGER ] ])
参数
location
filename
dest_dir
dest_file
start_line
end_line
示例:
CREATE DIRECTORY empdir AS 'C:/TEMP/EMPDIR'; DECLARE v_empfile UTL_FILE.FILE_TYPE; v_src_dir VARCHAR2(50) := 'empdir'; v_src_file VARCHAR2(20) := 'empfile.csv'; v_dest_dir VARCHAR2(50) := 'empdir'; v_dest_file VARCHAR2(20) := 'empcopy.csv'; v_emprec VARCHAR2(120); v_count INTEGER := 0; BEGIN UTL_FILE.FCOPY(v_src_dir,v_src_file,v_dest_dir,v_dest_file); v_empfile := UTL_FILE.FOPEN(v_dest_dir,v_dest_file,'r'); DBMS_OUTPUT.PUT_LINE('The following is the destination file, ''' || v_dest_file || ''''); LOOP UTL_FILE.GET_LINE(v_empfile,v_emprec); DBMS_OUTPUT.PUT_LINE(v_emprec); v_count := v_count + 1; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN UTL_FILE.FCLOSE(v_empfile); DBMS_OUTPUT.PUT_LINE(v_count || ' records retrieved'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM); DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE); END; The following is the destination file, 'empcopy.csv' 7369,SMITH,CLERK,7902,17-DEC-80,800,,20 7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30 7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30 7566,JONES,MANAGER,7839,02-APR-81,2975,,20 7654,MARTIN,SALESMAN,7698,28-SEP-81,1250,1400,30 7698,BLAKE,MANAGER,7839,01-MAY-81,2850,,30 7782,CLARK,MANAGER,7839,09-JUN-81,2450,,10 7788,SCOTT,ANALYST,7566,19-APR-87,3000,,20 7839,KING,PRESIDENT,,17-NOV-81,5000,,10 7844,TURNER,SALESMAN,7698,08-SEP-81,1500,0,30 7876,ADAMS,CLERK,7788,23-MAY-87,1100,,20 7900,JAMES,CLERK,7698,03-DEC-81,950,,30 7902,FORD,ANALYST,7566,03-DEC-81,3000,,20 7934,MILLER,CLERK,7782,23-JAN-82,1300,,10 14 records retrieved
UTL_FILE.FFLUSH
存储过程FFLUSH强制缓冲区中未写入磁盘的内容写到磁盘文件中,并将缓冲区的内容清空。
函数原型:FFLUSH(file FILE_TYPE)
参数:
file
示例:
调用存储过程NEW_LINE后,将缓冲区中的每一行记录强制写到磁盘中。
DECLARE v_empfile UTL_FILE.FILE_TYPE; v_directory VARCHAR2(50) := 'empdir'; v_filename VARCHAR2(20) := 'empfile.csv'; CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno; BEGIN v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w'); FOR i IN emp_cur LOOP UTL_FILE.PUT(v_empfile,i.empno); UTL_FILE.PUT(v_empfile,','); UTL_FILE.PUT(v_empfile,i.ename); UTL_FILE.PUT(v_empfile,','); UTL_FILE.PUT(v_empfile,i.job); UTL_FILE.PUT(v_empfile,','); UTL_FILE.PUT(v_empfile,i.mgr); UTL_FILE.PUT(v_empfile,','); UTL_FILE.PUT(v_empfile,i.hiredate); UTL_FILE.PUT(v_empfile,','); UTL_FILE.PUT(v_empfile,i.sal); UTL_FILE.PUT(v_empfile,','); UTL_FILE.PUT(v_empfile,i.comm); UTL_FILE.PUT(v_empfile,','); UTL_FILE.PUT(v_empfile,i.deptno); UTL_FILE.NEW_LINE(v_empfile); UTL_FILE.FFLUSH(v_empfile); END LOOP; DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename); UTL_FILE.FCLOSE(v_empfile); END;
UTL_FILE.FREMOVE
存储过程FREMOVE用于从系统中删除一个文件。
函数原型:
FREMOVE(location VARCHAR2, filename VARCHAR2)
如果要删除的文件不存在,那么会产生一个异常。 参数: location 目录名称,存放在pg_catalog.edb_dir.dirname中,这个目录包含要删除的文件。 filename 要删除文件的名称。 示例: 下面的示例删除了文件 empfile.csv:
DECLARE v_directory VARCHAR2(50) := 'empdir'; v_filename VARCHAR2(20) := 'empfile.csv'; BEGIN UTL_FILE.FREMOVE(v_directory,v_filename); DBMS_OUTPUT.PUT_LINE('Removed file: ' || v_filename); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM); DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE); END; Removed file: empfile.csv
UTL_FILE.FRENAME
存储过程FRENAME修改一个文件的名称,这样我们可以把一个文件从一个位置移动到另外一个位置。
函数原型:
FRENAME(location VARCHAR2, filename VARCHAR2, dest_dir VARCHAR2, dest_file VARCHAR2, [ overwrite BOOLEAN ])
参数: location 目录名称,存放在pg_catalog.edb_dir.dirname中,这个目录包含要改名的文件。 filename 要改名的源文件名称。 dest_dir 目录名称,存放在pg_catalog.edb_dir.dirname中,这个目录是被改名文件所在的目录。 dest_file 原始文件的新名称。 overwrite 如果设置为”true”,在dest_dir目录中覆盖任何名为dest_file的文件。若设置为”false”,就会产生异常。这是缺省情况。 示例: 下面我们将文件C:\TEMP\EMPDIR\empfile.csv重新命名,这个文件包含一个逗号分隔的列表,内容是表emp中雇员的信息。然后列出重新命名后的文件 C:\TEMP\NEWDIR\newemp.csv的内容。
CREATE DIRECTORY "newdir" AS 'C:/TEMP/NEWDIR'; DECLARE v_empfile UTL_FILE.FILE_TYPE; v_src_dir VARCHAR2(50) := 'empdir'; v_src_file VARCHAR2(20) := 'empfile.csv'; v_dest_dir VARCHAR2(50) := 'newdir'; v_dest_file VARCHAR2(50) := 'newemp.csv'; v_replace BOOLEAN := FALSE; v_emprec VARCHAR2(120); v_count INTEGER := 0; BEGIN UTL_FILE.FRENAME(v_src_dir,v_src_file,v_dest_dir, v_dest_file,v_replace); v_empfile := UTL_FILE.FOPEN(v_dest_dir,v_dest_file,'r'); DBMS_OUTPUT.PUT_LINE('The following is the renamed file, ''' || v_dest_file || ''''); LOOP UTL_FILE.GET_LINE(v_empfile,v_emprec); DBMS_OUTPUT.PUT_LINE(v_emprec); v_count := v_count + 1; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN UTL_FILE.FCLOSE(v_empfile); DBMS_OUTPUT.PUT_LINE(v_count || ' records retrieved'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM); DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE); END; The following is the renamed file, 'newemp.csv' 7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10 14 records retrieved