获取操作系统目录下文件列表
很久之前写了《关于UTL_FILE包体的使用》,那个脚本需要手工维护文件名列表,比较麻烦,后来一直想能否自动读取指定目录下的文件名,然后使用我那个UTL_FILE过程读取文件内容。有试过使用ls 命令进行重定向到日志文件,并配合Linux的定时任务(crontab)来解决,后来由于工作原因停止了测试,最后不了了之。前天看了盖老大的《循序渐进ORACLE》,发现了"9.6 获取操作系统文件列表"一节(P383),颇感意外,欣喜异常。适逢周末,决定小试一把。
1.创建临时表
create global temporary table crm.dirlist( filename varchar2(255), filesize number, filedate date) on commit delete rows; / |
创建临时表保存文件列表信息。此处使用临时表的好处是:循环取文件列表时无需对表进行清空处理。
2.创建JAVA SOURCE过程
此过程用户访问操作系统目录并读取文件列表.
create or replace and compile java source named DirList as import java.io.*; import java.sql.*; public class DirList { public static void getList(String directory) throws SQLException { File path=new File(directory); String[] fileList=path.list(); String fileName; long fileSize; long fileDate; for (int i=0;i<fileList.length; i++) { fileName=fileList[i]; File fpath=new File(directory+'/'+fileName); fileSize=fpath.length(); fileDate=fpath.lastModified(); #sql{insert into crm.dirlist(filename, filesize, filedate) values(:fileName,:fileSize,to_date('01/01/1970','mm/dd/yyyy')+:fileDate/(24*60*60*1000))}; } } } |
3.创建ORACLE存储过程
此过程用于调用和执行JAVA存储过程(DirList)
CREATE OR REPLACE PROCEDURE CRM.p_get_dir_list(i_directory IN VARCHAR2) AS LANGUAGE JAVA NAME 'DirList.getList(java.lang.String)'; |
4.执行p_get_dir_list过程获取数据
SQL> exec crm.p_get_dir_list('E:/割接/10_Transition_SVN_NEW/1_C网在用提取脚本/2.三户'); begin crm.p_get_dir_list('E:/割接/10_Transition_SVN_NEW/1_C网在用提取脚本/2.三户'); end; ORA-29532: Java 调用被未捕获的 Java 异常错误终止: java.security.AccessControlException: the Permission (java.io.FilePermission E:/割接/10_Transition_SVN_NEW/1_C网在用提取脚本/2.三户 read) has not been granted to CRM. The PL/SQL to grant this is dbms_java.grant_permission( 'CRM', 'SYS:java.io.FilePermission', 'E:/割接/10_Transition_SVN_NEW/1_C网在用提取脚本/2.三户', 'read' ) ORA-06512: 在 "CRM.GET_DIR_LIST", line 1 ORA-06512: 在 line 2 |
执行时出错,提示无权限。这里耽误了很久,搜索了很多关于这个错误的帖子,都未提到解决办法。后来根据这个错误提示,用SYS执行:
SQL> exec dbms_java.grant_permission( 'CRM', 'SYS:java.io.FilePermission', 'E:/割接/10_Transition_SVN_NEW/1_C网在用提取脚本/2.三户', 'read' ); PL/SQL procedure successfully completed SQL> exec dbms_java.grant_permission( 'CRM', 'SYS:java.io.FilePermission', 'E:/割接/10_Transition_SVN_NEW/1_C网在用提取脚本/2.三户/*', 'read' ); PL/SQL procedure successfully completed |
此处需要用SYS用户执行dbms_java.grant_permission分别授权目录和目录文件列表(*代替即可)访问权限给指定用户。然后执行:
SQL> exec crm.p_get_dir_list('E:/割接/10_Transition_SVN_NEW/1_C网在用提取脚本/2.三户'); PL/SQL procedure successfully completed |
5.查询文件列表信息
SQL> col FILESIZE for a20 SQL> col FILENAME for a40 SQL> col FILEDATE for a30 SQL> select * from crm.dirlist; FILENAME FILESIZE FILEDATE ------------------------------------------------------ ---------------------------- ------------------------------ .svn 0 2008-11-7 1:55:23 2.1--中间表数据倒换脚本-客户数据.sql 9355 2008-10-9 3:35:34 2.10--中间表数据倒换脚本-客户扩展.sql 5833 2008-10-8 7:02:30 2.2--中间表数据倒换脚本-帐户数据.sql 3993 2008-11-4 3:35:13 2.3--中间表数据倒换脚本-产品.sql 3501 2008-11-7 1:45:41 2.4--中间表数据倒换脚本-商品.sql 12432 2008-11-4 8:26:33 2.5--中间表数据倒换脚本-产品特性.sql 20027 2008-11-4 8:27:35 2.6--中间表数据倒换脚本-商品关联.sql 1827 2008-10-8 7:02:30 2.7--中间表数据倒换脚本-帐务数据.sql 4887 2008-10-13 7:43:28 2.8--中间表数据倒换脚本-商品担保.sql 5775 2008-10-22 2:57:30 2.9--中间表数据倒换脚本-客户联系人.sql 2548 2008-10-9 9:22:12 11 rows selected |
The result is very perfect!盖老大功力窥然可见,佩服,佩服!
转自http://oradbafans.spaces.live.com/blog/cns!91687AA33391DFED!180.entry