相同檔案名稱但內容有異動過, 或者不同檔案,
都會產生不同的 MD5 碼,
也可藉由此判斷檔案是否已存在或異動過,
參考, 如下 :
Java Stored Procedure 程式碼
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "JavaProcedure" AS import java.io.*; public class JavaProcedure { /* ====================================================== 功用 : 取得檔案 MD5 參數 : vFile : 來源檔 (包含路徑) 傳回 : 若執行成功, 則傳回 MD5 碼 若執行失敗, 則傳回 Error 錯誤碼 ====================================================== */ public static String getFileMD5( String vFile ) { // MD5 碼 String md5Code = ""; try { File f1 = new File( vFile ); if( f1.exists() ) { // 取得檔案的 MD5 InputStream fis = new FileInputStream(vFile); byte[] buffer = new byte[1024]; java.security.MessageDigest complete = java.security.MessageDigest.getInstance("MD5"); int numRead; do { numRead = fis.read(buffer); if (numRead > 0) { complete.update(buffer, 0, numRead); } } while (numRead != -1); fis.close(); // byte[] 轉換為 HEX 字串 byte[] b = complete.digest(); for (int i=0; i < b.length; i++) { md5Code += Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 ); } } else { md5Code = "Error: " + vFile + " 檔案不存在"; } } catch( Exception e ) { md5Code = "Error: " + e.toString(); } return md5Code; } }
Oracle Stored Procedure 程式碼
CREATE OR REPLACE FUNCTION GET_FILE_MD5( P_FILE_PATH VARCHAR2 ) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'JavaProcedure.getFileMD5(java.lang.String) return java.lang.String';
Example 程式碼
declare v_db_directory_name varchar2(30) := 'FILE_PATH'; vPath varchar2(100); vFile varchar2(100) := 'TEST/tom_test.xls'; vResult varchar2(255); begin -- 檔案的放置路徑 select directory_path into vPath from all_directories where directory_name = v_db_directory_name; -- 取得檔案 MD5 vResult := GET_FILE_MD5( vPath || '/' || vFile ); -- 顯示結果 dbms_output.put_line( vPath || '/' || vFile || ' 的 MD5: ' || vResult ); end;