暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 eygle 2019-12-06
1592

很多读者可能会有这样的问题:如果不知道具体的文件名称,那么该如何获取某些文件的名称呢?

如果数据库安装了JServer选项,就可以通过一个Java存储过程简单地获得某个目录下的文件列表。

1、创建临时表

首先需要创建一个临时表,用于保存文件信息:

SQL> CREATE GLOBAL TEMPORARY TABLE dirlist (
  2       filename VARCHAR2(255)
  3     , filesize NUMBER
  4     , filedate DATE
  5  )
  6  ON COMMIT DELETE ROWS
  7  /

Table created.
复制

2、创建存储过程

这个存储过程用于访问操作系统上的文件:

SQL> create or replace
  2          and compile java source named "DirList"
  3  as
  4          import java.io.*;
  5          import java.sql.*;
  6  
  7          public class DirList
  8          {
  9                  public static void getList(String directory)
 10                  throws SQLException
 11                  {
 12                          File path = new File( directory );
 13                          String[] fileList = path.list();
 14                          String fileName;
 15                          long fileSize;
 16                          long fileDate;
 17  
 18                          for(int i = 0; i < fileList.length; i++)
 19                          {
 20                                  fileName = fileList[i];
 21                                  File fpath = new File(directory + '/' + fileName );
 22                                  fileSize = fpath.length();
 23                                  fileDate = fpath.lastModified();
 24  
 25                                  #sql { insert into dirlist (filename,filesize,filedate)
 26                     values (:fileName, :fileSize
 27                   , to_date('01/01/1970','mm/dd/yyyy') + :fileDate / ( 24*60*60*1000)
 28                                                  )
 29                                          };
 30                                  }
 31                          }
 32  }
 33  /

Java created.
复制

最后再创建一个存储过程,用来调用和执行Java存储过程:

SQL> create or replace
  2  procedure get_dir_list( p_directory in varchar2 )
  3  as language java
  4  name 'DirList.getList( java.lang.String )';
  5  /

Procedure created.
复制

3、执行获取数据

接下来就可以通过执行存储过程,获得文件信息了:

SQL> exec get_dir_list('/opt/oracle/admin/mmsdb/bdump')

PL/SQL procedure successfully completed.
复制

查询临时表即可获得文件名等信息:

SQL> select * from dirlist where filename like '%.log' or filename like '%.trc'
  2  order by filedate desc;
FILENAME                                             FILESIZE FILEDATE
-------------------------------------------------- ---------- ------------
alert_mmsdb.log                                       2247743 04-JAN-07
mmsdb_lgwr_28662.trc                                  2105074 04-JAN-07
mmsdb_j000_3165.trc                                      2351 02-JAN-07
mmsdb_j001_15554.trc                                      813 23-DEC-06
mmsdb_j000_1383.trc                                       822 23-DEC-06
mmsdb_j001_23044.trc                                      812 14-DEC-06
mmsdb_j000_22010.trc                                      854 09-DEC-06
mmsdb_j000_23381.trc                                      811 08-DEC-06
mmsdb_j001_4992.trc                                       811 02-DEC-06
mmsdb_j000_27478.trc                                     3131 01-DEC-06
mmsdb_j001_15320.trc                                      812 30-NOV-06
…………………

75 rows selected.
复制

如果控制不好的话,其实这是一个危险的权限,可以通过这个过程查询得到比我们想象更多的信息:

SQL> exec get_dir_list('/etc'); 
PL/SQL procedure successfully completed.
SQL> select * from dirlist where filename like '%conf';

FILENAME                                             FILESIZE FILEDATE
-------------------------------------------------- ---------- ------------
inetd.conf                                               6606 24-JAN-05
prtconf                                                  5256 05-JAN-00
dacf.conf                                                2210 19-NOV-03
rpld.conf                                                 496 06-JAN-00
nsswitch.conf                                             780 01-DEC-06
syslog.conf                                              1034 24-JAN-05
vold.conf                                                 960 21-JAN-05
rmmount.conf                                              438 21-JAN-05
nscd.conf                                                1573 21-JAN-05
pam.conf                                                 2609 21-JAN-05
nfssec.conf                                               926 21-JAN-05
printers.conf                                             162 21-JAN-05
power.conf                                                561 21-JAN-05
coreadm.conf                                              314 31-JAN-05
dumpadm.conf                                              254 31-JAN-05
hba.conf                                                   21 24-JAN-05
resolv.conf                                                95 03-FEB-05

17 rows selected.
复制

再借助外部表,还可以得到部分文件的内容:

SQL> create or replace directory etc
  2    as '/etc'
  3  /
Directory created.
SQL> CREATE TABLE etc (text VARCHAR2(4000))
  2    ORGANIZATION EXTERNAL (
  3      TYPE oracle_loader
  4      DEFAULT DIRECTORY etc
  5      ACCESS PARAMETERS (
  6         RECORDS DELIMITED BY NEWLINE
  7         NOBADFILE
  8          NOLOGFILE
  9          NODISCARDFILE
 10      )
 11      LOCATION ('passwd')
 12    )
 13    REJECT LIMIT UNLIMITED
 14  /

Table created.
SQL> select * from etc;

TEXT
----------------------------------------------------------------
root:x:0:1:Super-User:/:/sbin/sh
daemon:x:1:1::/:
bin:x:2:2::/usr/bin:
sys:x:3:3::/:
adm:x:4:4:Admin:/var/adm:
lp:x:71:8:Line Printer Admin:/usr/spool/lp:
uucp:x:5:5:uucp Admin:/usr/lib/uucp:
nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico
listen:x:37:4:Network Admin:/usr/net/nls:
nobody:x:60001:60001:Nobody:/:
noaccess:x:60002:60002:No Access User:/:
nobody4:x:65534:65534:SunOS 4.x Nobody:/:
....
21 rows selected.
复制

所以,权限的控制在数据库中也是十分重要的。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论