Oracle JAVA SORCE and BLOB OBJECT

较老得plsql不能处理与OS的交互,比如获得文件目录,获得文件的大小等等,

plsql从9I开始支持javasource使用java处理OS交互。



例如 

需求 :导入到指定目录下面所有的文件到数据库,文件类型可能是图片,PDF,WORD等。

 

INPUT 

1.  指定的目录(包含子文件夹)

2.  指定的文件类型(suffix such as .pdf,take all is *) Such as

       exec pkg_file.FILE_INPUT('D:\SYSTEM','*');

           

EXPORT

1.  指定的文件名(包含全路经)

2.  指定的数据库中导出文件的文件ID Suchas

       execpkg_file.FILE_EXPORT('D:\kaokaokao.jpg',708);

Java IO FILE refer


GRANT JAVAUSERPRIV TO SCOTT;
GRANT Create ANY Directory TO SCOTT;
GRANT DROP ANY Directory TO SCOTT; 

DECLARE
  l_schema VARCHAR2(30) := 'SCOTT';
BEGIN
  DBMS_JAVA.grant_permission(l_schema, 'java.io.FilePermission', '<<ALL FILES>>', 'read ,write, execute, delete');
  DBMS_JAVA.grant_permission(l_schema, 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
  DBMS_JAVA.grant_permission(l_schema, 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
END;
/

CREATE SEQUENCE SEQ_FILE START WITH 1 INCREMENT BY 1;

CREATE TABLE FILE_LIST_INFO
( FILE_ID   NUMBER(10) PRIMARY KEY,
  FILE_NAME VARCHAR(200 CHAR) NOT NULL,
  FILE_PATH VARCHAR(200 CHAR) NOT NULL,
  FILE_TYPE VARCHAR(20 CHAR),
  FILE_LENGTH NUMBER(20) NOT NULL,
  FILE_CREATE_TIME VARCHAR(20 CHAR),
  FILE_MODIFY_TIME VARCHAR(20 CHAR),
  FILE_UPDATE_TIME DATE NOT NULL,
  FILE_LIST_ID NUMBER(10) 
) ROWDEPENDENCIES;

CREATE TABLE FILE_LIST
( LIST_ID     NUMBER(10) PRIMARY KEY,
  LIST_DATE   DATE DEFAULT SYSDATE,
  LIST_FILE   BLOB
) ROWDEPENDENCIES;

create or replace and compile java source named DirList as
  import java.lang.*;
  import java.io.*;
  import java.sql.*;
  import oracle.jdbc.*;
  import oracle.sql.*;
  import java.util.*;
  import java.text.*;

  public class DirList
  { 
    static void Process(File path_file,String path_suffix) throws SQLException
    {
      String v_file_name;
      String v_file_path;
      String v_parent_path;
      String v_file_type;
      long v_file_length;
      long v_file_modify;
      if(path_file.isFile())
      {
        v_file_name =path_file.getName();
        v_file_path =path_file.getPath();
        v_parent_path=path_file.getParent();
        v_file_type ="FILE";
        v_file_length =path_file.length();
        v_file_modify =path_file.lastModified(); 
        Date d = new Date(v_file_modify);
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
        String v_file_dateString = sdf.format(d);
        
        if (path_suffix.equals("*"))
        {
          Connection conn = null;
          CallableStatement cs = null;
          String val = null;
          conn = DriverManager.getConnection("jdbc:default:connection");
          cs = conn.prepareCall("{ call PKG_FILE.FILE_INPUT_DB(?,?,?,?,?,?) }");
          cs.setString(1, v_file_name);
          cs.setString(2, v_file_path);
          cs.setString(3, v_file_type);
          cs.setFloat(4, v_file_length);
          cs.setString(5, v_file_dateString);
          cs.setString(6, v_parent_path);
          cs.execute();
          cs.close();
          conn.close();
        }
        else
        {
          if (v_file_name.endsWith(path_suffix))
          {
            Connection conn = null;
            CallableStatement cs = null;
            String val = null;
            conn = DriverManager.getConnection("jdbc:default:connection");
            cs = conn.prepareCall("{ call PKG_FILE.FILE_INPUT_DB(?,?,?,?,?,?) }");
            cs.setString(1, v_file_name);
            cs.setString(2, v_file_path);
            cs.setString(3, v_file_type);
            cs.setFloat(4, v_file_length);
            cs.setString(5, v_file_dateString);
            cs.setString(6, v_parent_path);
            cs.execute();
            cs.close();
            conn.close();
          }
        }
      }
      else if (path_file.isDirectory())
      {
        v_file_name =path_file.getName();
        v_file_path =path_file.getPath();
        v_parent_path=path_file.getParent();
        v_file_type ="DIRECTORY";
        v_file_length =0;
        v_file_modify =path_file.lastModified(); 
        Date d = new Date(v_file_modify);
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
        String v_file_dateString = sdf.format(d);
        Connection conn = null;
        CallableStatement cs = null;
        String val = null;
        conn = DriverManager.getConnection("jdbc:default:connection");
        cs = conn.prepareCall("{ call PKG_FILE.FILE_INPUT_DB(?,?,?,?,?,?) }");
        cs.setString(1, v_file_name);
        cs.setString(2, v_file_path);
        cs.setString(3, v_file_type);
        cs.setFloat(4, v_file_length);
        cs.setString(5, v_file_dateString);
        cs.setString(6, v_parent_path);
        cs.execute();
        cs.close();
        conn.close();
        File[] listOfFiles = path_file.listFiles();
        if(listOfFiles!=null)
        {
          for (int j = 0; j < listOfFiles.length; j++)
          {
           Process(listOfFiles[j],path_suffix);
          }
        } 
      }
    }
    
    public static void Inputfile(String directory,String suffix)
                     throws SQLException
    {
      File path = new File( directory );
      #sql { truncate table FILE_LIST_INFO
      };
      #sql { truncate table FILE_LIST
      };
      Process(path,suffix);
    }
    
    public static void Exportfile(String myFile, BLOB myBlob) 
                     throws Exception
    {
      // Bind the image object to the database object
      // Open streams for the output file and the blob
      File binaryFile = new File(myFile);
      FileOutputStream outStream = new FileOutputStream(binaryFile);
      InputStream inStream = myBlob.getBinaryStream();
      // Get the optimum buffer size and use this to create the read/write buffer
      int size = myBlob.getBufferSize();
      byte[] buffer = new byte[size];
      int length = -1;
      // Transfer the data
      while ((length = inStream.read(buffer)) != -1)
      {
        outStream.write(buffer, 0, length);
        outStream.flush();
      }
      // Close everything down
      inStream.close();
      outStream.close();
    } 
  };
/

CREATE OR REPLACE PACKAGE PKG_FILE AS
  PROCEDURE FILE_INPUT(P_DIRECTORY IN VARCHAR2, P_SUFFIX IN VARCHAR2);
  PROCEDURE FILE_INPUT_DB(P_FILENAME   IN VARCHAR2,
                          P_FILEPATH   IN VARCHAR2,
                          P_FILETYPE   IN VARCHAR2,
                          P_FILELENGTH IN NUMBER DEFAULT 0,
                          P_FILEMODIFY IN VARCHAR2,
                          P_PARENTPATH IN VARCHAR2);
  PROCEDURE FILE_EXPORT_JAVA(P_FILE IN VARCHAR2, P_BLOB IN BLOB);
  PROCEDURE FILE_EXPORT(P_FILEPATH  IN VARCHAR2,P_FILEID IN NUMBER);
END;
/

CREATE OR REPLACE PACKAGE BODY PKG_FILE AS
  PROCEDURE FILE_INPUT(p_directory IN VARCHAR2, p_suffix IN VARCHAR2) AS
    LANGUAGE JAVA NAME 'DirList.Inputfile( java.lang.String , java.lang.String)';
  PROCEDURE FILE_INPUT_DB(P_FILENAME   IN VARCHAR2,
                          P_FILEPATH   IN VARCHAR2,
                          P_FILETYPE   IN VARCHAR2,
                          P_FILELENGTH IN NUMBER DEFAULT 0,
                          P_FILEMODIFY IN VARCHAR2,
                          P_PARENTPATH IN VARCHAR2) IS
    l_blob       BLOB;
    l_bfile      BFILE;
    v_sql_insert VARCHAR2(200);
  BEGIN
    --dynamic create the direcory FILE_DIR
    BEGIN
      v_sql_insert := 'Create Or Replace Directory FILE_DIR As ' || '''' ||
                      P_PARENTPATH || '\''';
      EXECUTE IMMEDIATE v_sql_insert;
    EXCEPTION
      WHEN OTHERS THEN
        RAISE_APPLICATION_ERROR(-20017,
                                'Can Not Dynamic Create the FILE_DIR Directory.' ||
                                SQLERRM);
    END;
  
    IF P_FILETYPE = 'FILE' THEN
    
      INSERT INTO FILE_LIST_INFO
        (FILE_ID,
         FILE_NAME,
         FILE_PATH,
         FILE_TYPE,
         FILE_LENGTH,
         FILE_UPDATE_TIME,
         FILE_MODIFY_TIME,
         FILE_LIST_ID)
      VALUES
        (SEQ_FILE.NEXTVAL,
         P_FILENAME,
         P_FILEPATH,
         P_FILETYPE,
         P_FILELENGTH,
         SYSDATE,
         P_FILEMODIFY,
         SEQ_FILE.CURRVAL);
    
      INSERT INTO FILE_LIST
        (LIST_ID, LIST_FILE)
      VALUES
        (SEQ_FILE.CURRVAL, empty_blob())
      RETURNING LIST_FILE INTO l_blob;
    
      l_bfile := bfilename('FILE_DIR', P_FILENAME);
      dbms_lob.fileopen(l_bfile);
      dbms_lob.loadfromfile(l_blob, l_bfile, dbms_lob.getlength(l_bfile));
      dbms_lob.fileclose(l_bfile);
    ELSE
      INSERT INTO FILE_LIST_INFO
        (FILE_ID,
         FILE_NAME,
         FILE_PATH,
         FILE_TYPE,
         FILE_LENGTH,
         FILE_UPDATE_TIME,
         FILE_MODIFY_TIME)
      VALUES
        (SEQ_FILE.NEXTVAL,
         P_FILENAME,
         P_FILEPATH,
         P_FILETYPE,
         P_FILELENGTH,
         SYSDATE,
         P_FILEMODIFY);
    END IF;
    COMMIT;
  END;
  
  PROCEDURE FILE_EXPORT_JAVA(P_FILE IN VARCHAR2, P_BLOB IN BLOB) AS
    LANGUAGE JAVA NAME 'DirList.Exportfile( java.lang.String, oracle.sql.BLOB)';

  PROCEDURE FILE_EXPORT(P_FILEPATH IN VARCHAR2, P_FILEID IN NUMBER) IS
    v_fileid   NUMBER(10);
    v_filename VARCHAR(200);
    v_filetype VARCHAR(20);
    v_blob     BLOB;
  BEGIN
    --check the file id
    BEGIN
      SELECT FILE_LIST_INFO.FILE_LIST_ID,
             FILE_LIST_INFO.FILE_NAME,
             FILE_LIST_INFO.FILE_TYPE,
             FILE_LIST.LIST_FILE
        INTO v_fileid, v_filename, v_filetype, v_blob
        FROM FILE_LIST_INFO, FILE_LIST
       WHERE FILE_LIST_INFO.FILE_LIST_ID = FILE_LIST.LIST_ID
         AND FILE_LIST_INFO.FILE_LIST_ID = P_FILEID;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        RAISE_APPLICATION_ERROR(-20017,
                                'Can Not Find The File ID.' ||
                                SQLERRM);
    END;
    FILE_EXPORT_JAVA(P_FILEPATH,v_blob);
  END;
END PKG_FILE;
/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值