Java存储过程在Oracle数据库中不返回任何内容

时间:2014-04-02 21:41:10

标签: java oracle stored-procedures plsql oracle11g

我在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个项目。

2 个答案:

答案 0 :(得分:1)

  • 我不确定你是如何检查结果的(同一会话与否)。你在某处执行提交吗?全局临时表有一些细节(可以选择是否在提交后清除数据)。您可能希望最初尝试永久性问题,直到解决问题为止。
  • 如果添加一些日志记录(例如,添加到另一个表),它可能会很有用。例如。 rootDirList.length可能是一个很好的检查指标。

其他一些评论:

  • / *在if语句中不执行任何操作* / branches会增加额外的噪音。很高兴删除它们。
  • 如果要检查路径是否是目录(而不是isFile),也许最好使用.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/');