以前听说oracle中可以使用utl_file读写文件,一直没机会接触到,再看了utl_file读文件的例子后,感觉和java中的读文件很像,一下是一个简单的使用utl_file读文件的例子,大神请绕过,因为例子真的很简单,我使用的oracle版本是10.2。
首先,普通用户要想使用utl_file,必须要有权限,首先使用dba登录,给用户授权,如下所示:
- D:\oracle\app\oracle\product\10.2.0\server\BIN>sqlplus "connect as sysdba"
- SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 1月 26 10:25:40 2014
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
- 输入口令:
- 连接到:
- Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
- SQL> grant execute on utl_file to testuser;
- 授权成功。
有了权限之后,要想读取文件,需新建一个目录directory,还得对该目录有读取权限:
新建目录命令如下:
- SQL> create or replace directory ORADIR_MY_FILE as 'f:/saveFile/oracle/';
- 目录已创建。
对用户授予该目录读写权限
- SQL> grant write,read on directory ORADIR_MY_FILE to testuser;
- 授权成功。
如果限制用户只有读权限可以把write去掉。
能授予权限就能撤销用户权限,撤销用户权限命令如下:
- revoke write,read on directory ORADIR_MY_FILE from testuser;
查看系统所有目录命令如下:
- select * from dba_directories;
如想删除目录,可以这样做:
- SQL> drop directory ORADIR_MY_FILE;
- 目录已删除。
目录新建完了,权限也有了,可以试下读取文件了:
- ---读文件测试
- DECLARE
- f_file utl_file.file_type;
- c_line VARCHAR2(2048);
- BEGIN
- --打开文件
- f_file := utl_file.fopen('ORADIR_MY_FILE',
- 'testsql.sql',
- 'R');
- IF utl_file.is_open(f_file) THEN
- LOOP
- BEGIN
- utl_file.get_line(f_file, c_line);
- EXCEPTION
- WHEN no_data_found THEN
- EXIT;
- END;
- dbms_output.put_line(c_line);
- END LOOP;
- END IF;
- IF utl_file.is_open(f_file) THEN
- utl_file.fclose(f_file);
- END IF;
- EXCEPTION
- WHEN OTHERS THEN
- IF utl_file.is_open(f_file) THEN
- utl_file.fclose(f_file);
- END IF;
- dbms_output.put_line('异常:' || SQLERRM);
- END;
utl_file.fopen('ORADIR_MY_FILE','testsql.sql','R');第一个参数是刚才新建的目录,第二个参数是文件名,可以使用全路径如:'f:/saveFile/oracle/testsql.sql';文件不一定是sql文件,什么java,txt,xml都可以,别试着打开doc之类的文件,这样你得到的将是乱码。
经我测试,文件名不能使用中文,还有'f:/saveFile/oracle/'和'f:/saveFile/oracle/test/'是不同的2个目录,对'f:/saveFile/oracle/'授权并不说明对'f:/saveFile/oracle/test/'目录也有权限,上面的结论是我测试的结果,如果有误,请指正,谢谢!