利用pl/sql读文件

以前听说oracle中可以使用utl_file读写文件,一直没机会接触到,再看了utl_file读文件的例子后,感觉和java中的读文件很像,一下是一个简单的使用utl_file读文件的例子,大神请绕过,因为例子真的很简单,我使用的oracle版本是10.2。

    首先,普通用户要想使用utl_file,必须要有权限,首先使用dba登录,给用户授权,如下所示:

   

Sql代码   收藏代码
  1. D:\oracle\app\oracle\product\10.2.0\server\BIN>sqlplus "connect as sysdba"  
  2.   
  3. SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 1月 26 10:25:40 2014  
  4.   
  5. Copyright (c) 1982, 2005, Oracle.  All rights reserved.  
  6.   
  7. 输入口令:  
  8.   
  9. 连接到:  
  10. Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production  
  11.   
  12. SQL> grant execute on utl_file to testuser;  
  13.   
  14. 授权成功。  

    有了权限之后,要想读取文件,需新建一个目录directory,还得对该目录有读取权限:

    新建目录命令如下:

   

Sql代码   收藏代码
  1. SQL> create or replace directory ORADIR_MY_FILE as 'f:/saveFile/oracle/';  
  2.   
  3. 目录已创建。  

    对用户授予该目录读写权限

   

Sql代码   收藏代码
  1. SQL> grant write,read on directory ORADIR_MY_FILE to testuser;  
  2.   
  3. 授权成功。  

    如果限制用户只有读权限可以把write去掉。

    能授予权限就能撤销用户权限,撤销用户权限命令如下:

   

Sql代码   收藏代码
  1. revoke write,read on directory ORADIR_MY_FILE from testuser;  

    查看系统所有目录命令如下:

   

Sql代码   收藏代码
  1. select * from dba_directories;  

   如想删除目录,可以这样做:

  

Sql代码   收藏代码
  1. SQL> drop directory ORADIR_MY_FILE;  
  2.   
  3. 目录已删除。  

    目录新建完了,权限也有了,可以试下读取文件了:

   

Sql代码   收藏代码
  1. ---读文件测试  
  2. DECLARE  
  3.   f_file utl_file.file_type;  
  4.   c_line VARCHAR2(2048);  
  5. BEGIN  
  6.   --打开文件  
  7.   f_file := utl_file.fopen('ORADIR_MY_FILE',  
  8.                            'testsql.sql',  
  9.                            'R');  
  10.     
  11.   IF utl_file.is_open(f_file) THEN  
  12.     LOOP  
  13.       BEGIN  
  14.         utl_file.get_line(f_file, c_line);  
  15.       EXCEPTION  
  16.         WHEN no_data_found THEN  
  17.           EXIT;  
  18.       END;  
  19.       dbms_output.put_line(c_line);  
  20.     END LOOP;  
  21.   END IF;  
  22.   IF utl_file.is_open(f_file) THEN  
  23.     utl_file.fclose(f_file);  
  24.   END IF;  
  25. EXCEPTION  
  26.   WHEN OTHERS THEN  
  27.     IF utl_file.is_open(f_file) THEN  
  28.       utl_file.fclose(f_file);  
  29.     END IF;  
  30.     dbms_output.put_line('异常:' || SQLERRM);  
  31. 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/'目录也有权限,上面的结论是我测试的结果,如果有误,请指正,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值