很多读者可能会有这样的问题:如果不知道具体的文件名称,那么该如何获取某些文件的名称呢?
如果数据库安装了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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1376次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
837次阅读
2025-03-17 11:33:53
RAC 19C 删除+新增节点
gh
520次阅读
2025-03-14 15:44:18
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
481次阅读
2025-03-13 14:38:19
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
381次阅读
2025-03-12 21:27:56
Oracle DataGuard高可用性解决方案详解
孙莹
333次阅读
2025-03-26 23:27:33
墨天轮个人数说知识点合集
JiekeXu
280次阅读
2025-04-01 15:56:03
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
271次阅读
2025-03-10 07:58:44
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
259次阅读
2025-03-19 14:41:51
风口浪尖!诚通证券扩容采购Oracle 793万...
Roger的数据库专栏
256次阅读
2025-03-24 09:42:53