1.首先创建一个表空间crm 然后在创建一个用户名crm:
接下来就是创建零时表:dirlist
create global temporary table crm.dirlist(
filename varchar2(255),
filesize number,
filedate date)
on commit delete rows;
2.创建JAVA资源包DirList
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 存储过程获取指定目录文件信息p_get_dir_list。
CREATE OR REPLACE PROCEDURE CRM.p_get_dir_list(i_directory IN VARCHAR2) AS
LANGUAGE JAVA NAME 'DirList.getList(java.lang.String)';
4,按照上面的几个步骤做完,执行存储过程exec crm.p_get_dir_list('E:/脚本');
begin crm.p_get_dir_list('E:/ 脚本'); end; 会报如下异常:
ORA-29532: Java 调用被未捕获的 Java 异常错误终止: java.security.AccessControlException: the Permission (java.io.FilePermission E:/ 脚本 read) has not been granted to CRM. The PL/SQL to grant this is dbms_java.grant_permission( 'CRM', 'SYS:java.io.FilePermission', ' E:/ 脚本', 'read' )
ORA-06512: 在 "CRM.GET_DIR_LIST", line 1
ORA-06512: 在 line 2
那么遇见上面的错误怎么解决呢? 其实很简单,错误提示已经给出了解决方案! 由于权限不足引起的错误,那么我们用 dbms_java.grant_permission 来指定访问目录的权限!
1. 首先在开始菜单—运行-cmd –sqlplus
2. 在输入用户名的时候 sys as sysdba
3. 密码:lester
4. exec dbms_java.grant_permission( 'CRM', 'SYS:java.io.FilePermission', 'E:/脚本', 'read' );
5. exec dbms_java.grant_permission( 'CRM', 'SYS:java.io.FilePermission', ' E:/脚本/*', 'read' );
6. 此处需要用SYS用户执行dbms_java.grant_permission分别授权目录和目录文件列表(*代替即可)访问权限给指定用户。然后执行:
7. exec crm.p_get_dir_list(' E:/脚本');
8. 在执行查询语句!select * from crm.dirlist. OK 大功告成。