将文件加载到oracle数据库

时间:2014-04-07 18:39:20

标签: java oracle stored-procedures plsql oracle11g

情景

  • 我的oracle数据库服务器上有一个根目录 / rootFolder / myDir /
  • 我目前在 / myDir / 下有20个子文件夹,可以扩展到更多
  • 在这20个子文件夹中,PDF,DOC,xlsx等文档数量不断变化。
  • 我需要能够 / myDir / 中的所有文档动态加载到最后一个文件夹中作为blob对象加入表格。

到目前为止我能够做到的。

我创建了一个Java存储过程,它将遍历给定的目录结构,并将FileNameFilePathlenDate写入表{{1 }}

WEB_DIRLIST

这很有效,我的意图是让pl / sql存储过程使用WEB_DIRLIST中的值作为输入到程序的输入,该过程获取路径和文件名并上传到表WEB_STATICDOCS

以下是我的代码。

DROP JAVA SOURCE BALT_CHECK."WebDocs";

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
{
    walkin(rootdirectory);
}

public static void walkin(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()) {

            String dirName = DirList[x];
             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_DIRLIST (ID, FILE_NAME, FILE_SIZE,  CREATE_DATE, FILE_PATH)
         VALUES (:elementID, :fileName, :len, to_date(:sqlDate, 'YYYY-MM-DD HH24:MI:SS'), :filePath) };

 }        

 }

/

我已经对BFILENAME输入参数进行了硬编码,但我希望它是动态的。

当我硬编码Name并在oracle中为我上传的文件夹创建目录条目时,此代码没有问题。 (在这种情况下,目录名称被称为&#39; ACCTG&#39;。根据我能够找到的内容,我必须在oracle中为我想要读取的每个目录创建一个目录条目...这是唯一的方法吗?如果我不知道目录怎么办?如果子目录中有子目录怎么办?

如果可能,我希望从一个声明中做到这一点。可以通过Java存储过程完成吗?如果是这样如何?

修改

基于@ justin-cave提供的示例 http://www.idevelopment.info/data/Programming/java/jdbc/LOBS/BLOBFileExample.java

他的程序如何知道文件在要上载的服务器上的位置?他传了这个名字,但是

CREATE OR REPLACE PROCEDURE BALT_CHECK.insert_doc as 
f_lob BFILE;
b_lob BLOB;
BEGIN
INSERT INTO WEB_DOCS VALUES('2',EMPTY_BLOB(),'PDF','Acctg001-travelexpensereport.pdf')
RETURN blob_col INTO b_lob;

f_lob := BFILENAME('ACCTG','Acctg001-travelexpensereport.pdf'); 
dbms_lob.fileopen(f_lob, dbms_lob.file_readonly);
dbms_lob.loadfromfile( b_lob, f_lob, dbms_lob.getlength(f_lob));
dbms_lob.fileclose(f_lob);
COMMIT;
END;
/

1 个答案:

答案 0 :(得分:3)

如果要通过PL / SQL加载文件,则需要为要从中读取数据的每个目录和子目录运行CREATE DIRECTORY语句。这无疑是可能的,但它相当笨重。

由于您已经拥有了一个遍历目录结构的Java存储过程,因此从Java而不是PL / SQL将数据加载到BLOB列中似乎更合乎逻辑。有许多例子可以将数据从文件写入网络上的BLOB。我在本示例中以writeBLOBPut method开头,但您也可以从Java教程中的Using Large Objects页面开始。