使用directory要解��两个层面权限,一个是操作系统层面,要让Oracle操作系统用户可以使用目录。另一个是directory对象使用权,要进行显示的授权。
SQL> grant write on directory utl_path to scott;
Grant succeeded
SQL> grant execute on utl_file to scott;
Grant succeeded
最后,可以在代码中进行调用。
SQL> set serveroutput on size 1000;
SQL> declare
2 out_file utl_file.file_type; --文件类型,也就是句柄对象
3 vc_file_name varchar2(100);
4 vc_line varchar2(100);
5 i number;
6 begin
7 vc_file_name := 'utl_file_test.txt';
8
9 out_file := utl_file.fopen('UTL_PATH',vc_file_name,'w'); --写方式打开文件
10
11 if (utl_file.is_open(out_file)) then
12 for i in 1..100 loop
13 vc_line := to_char(i)||','||i||'Lines~';
14 utl_file.put_line(out_file,vc_line);
15 end loop;
16 else
17 dbms_output.put_line('Open Failure~');
18 end if;
19
20 utl_file.fclose(out_file); --和C语言一样,需要显示进行关闭
21 end;
22 /
PL/SQL procedure successfully completed
最后,就可以在操作系统层面,找到对应文件。
[root@sicslife /]# cd /upload/
[root@sicslife upload]# ls -l
total 12
drwxr-xr-x. 7 oracle oinstall 4096 Aug 27 2013 database
drwx------. 3 oracle oinstall 4096 Aug 5 17:26 igb-5.3.2
-rw-r--r--. 1 oracle oinstall 1184 Aug 7 02:19 utl_file_test.txt
[root@sicslife upload]# cat utl_file_test.txt
1,1Lines~
2,2Lines~
3,3Lines~
4,4Lines~
5,5Lines~
6,6Lines~
(篇幅原因,有省略…….)
[root@sicslife upload]#
Utl_file包是一种比较成熟的文件读写方案,除了实例中操作的步骤方法之外,还定义了很多有用的读写方法、异常类型,这对于我们进行完善编程是很有意义的。同时,在实际应用中,utl_file有着更多的细节因素和限制特性,本篇不予累述。
3、结论
利用数据库生成文件,是非常常见的需求。在不借助第三方工具的情况下,spool和utl_file是不错的工具选择。