很多读者可能会有这样的问题:如果不知道具体的文件名称,那么该如何获取某些文件的名称呢?
如果数据库安装了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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。