我在oracle数据库中有一个相当简单的存储java过程。目的是读取驻留在Oracle服务器上的文件夹的内容。如果遇到文件夹,它将进入文件夹并将内容名称写入全局临时表,然后转到下一个文件夹。 Java过程编译得很好并且没有问题地提交到数据库中。当它由存储的Oracle过程调用时,它也会成功运行。但是在全局临时表中没有产生任何结果。我正在使用TOAD,我不确定如何在运行时间休息或查看变量,所以我有点盲目飞行。而且我确实不是一个很好的java。
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED BALT_CHECK."WebDirList" AS
import java.io.*;
import java.sql.*;
import java.util.Date;
import java.text.SimpleDateFormat;
public class WebDirList
{
public static void getList(String rootdirectory) throws SQLException
{
File path = new File( rootdirectory );
String[] rootDirList = path.list();
String element;
for( int x = 0; x < rootDirList.length; x++)
{
element = rootDirList[x];
String newPath = rootdirectory + "/" + rootDirList[x] ;
File f = new File(newPath);
if (f.isFile()){
/* Do Nothing */
} else {
/*if it is a folder than load the subDirPath variable with the newPath variable */
File subDirPath = new File( newPath+"/");
String[] subDirList = subDirPath.list();
String efileName;
for(int i = 0; i < subDirList.length; i++)
{
efileName = subDirList[i];
String fpath = subDirPath + "/" + subDirList[i];
File nf = new File(fpath);
long len;
Date date;
String ftype;
String sqlDate;
SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss");
if (f.isFile()) {
len = f.length();
date = new Date(f.lastModified());
sqlDate = df.format(date);
#sql { INSERT INTO WEB_DIRLIST (FILENAME, LENGTH, CREATEDATE)
VALUES (:efileName, :len, to_date(:sqlDate, 'YYYY-MM-DD HH24:MI:SS')) };
}else{
/* Do nothing */
}
}
}
}
}
}
/
过程创建为
CREATE OR REPLACE procedure BALT_CHECK.get_webdir_list( p_directory in varchar2)
as language java
name 'WebDirList.getList( java.lang.String )';
/
程序称为
exec get_webdir_list( '/transfer_edi/hs122/');
文件夹/ transfer / edi / hs122 /中的是10个子目录,在任何给定时间,每个子目录中都有1到100个项目。
答案 0 :(得分:1)
rootDirList.length
可能是一个很好的检查指标。其他一些评论:
.isDirectory()
。答案 1 :(得分:0)
此代码中存在一些错误,导致无法写入数据库。基于Yavor建议将字符串变量写入临时表,我能够发现我在文件路径上复制了“/”,例如(/ transfer_edi / hs122 // ACCTG)。我还发现我的数据表中的一个列上的数据类型不正确,我也在编写。我也切换到常规表而不是提交后删除的全局临时表。再次感谢Yavor。无论如何,我最终重写了整个事情。我意识到我需要遍历目录结构以获取所有文件,所以这里是最适合我的代码。我再也不是一个java家伙,所以我相信这可以做得更好。
这个链接给了我很多帮助 http://rosettacode.org/wiki/Walk_a_directory/Recursively#Java
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED BALT_CHECK."WebDocs" AS
import java.io.*;
import java.sql.*;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.lang.String;
public class WebDocs
{
public static long fileID;
public static void GetDocs(String rootdirectory) throws SQLException
{
stepinto(rootdirectory);
}
public static void stepinto(String rootdirectory) throws SQLException
{
File path = new File( rootdirectory );
String[] DirList = path.list();
for( int x = 0; x < DirList.length; x++)
{
String newPath = rootdirectory + DirList[x];
if (newPath != null) {
File f = new File(newPath);
if (f.isDirectory()) {
GetDocs(newPath +"/");
}
if (f.isFile()){
WriteFile(f);
}else{
}
}
}
}
public static void WriteFile(File file) throws SQLException
{
String fileName;
String filePath;
String elementID;
long len;
Date date;
String sqlDate;
SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss");
fileID = fileID + 1;
elementID = String.valueOf(fileID);
fileName = file.getName();
filePath = file.getPath();
len = file.length();
date = new Date(file.lastModified());
sqlDate = df.format(date);
#sql { INSERT INTO WEB_STATICDOCS (ID, FILE_NAME, FILE_SIZE, CREATE_DATE, FILE_PATH)
VALUES (:elementID, :fileName, :len, to_date(:sqlDate, 'YYYY-MM-DD HH24:MI:SS'), :filePath) };
}
}
/
Oracle存储过程
CREATE OR REPLACE procedure BALT_CHECK.getWebDocs( p_directory in varchar2)
as language java
name 'WebDocs.GetDocs( java.lang.String )';
/
调用存储过程
exec getWebDocs( '/transfer_edi/hs122/');