Oracle 取得檔案唯一性識別碼 MD5

Oracle PL/SQL 如何產生檔案的 MD5 碼,

相同檔案名稱但內容有異動過, 或者不同檔案,

都會產生不同的 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;
Related Posts Plugin for WordPress, Blogger...