ORACLE获取操作系统目录下文件列表

来源:互联网 发布:期货从业题库知乎 编辑:程序博客网 时间:2024/05/03 07:41
      

获取操作系统目录下文件列表

   很久之前写了《关于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!盖老大功力窥然可见,佩服,佩服!


原创粉丝点击