首先,聲明下次方法不是用來攻破服務器用的,只是爲了學習如何用 Oracle 存儲過程調用 JAVA 罷了。不過一些局域網應用系統使用 Oracle 作爲數據存儲工具時爲了實現一些功能也許也會用到。此方法是在蓋國強大神的《循序漸進Oracle 數據庫管理、優化與備份恢復》偷學過來的 ^_^
Orale 表及存儲過程
1. 首先創建個臨時表
CREATE GLOBAL TEMPORARY TABLE OS_DIR(
name VARCHAR2(255),
size_byte NUMBER,
modify_date DATE) ON COMMIT PRESERVE ROWS;
2.. Oracle JAVA Resource
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED GET_OS_DIR_JAVA AS
import java.io.*;
import java.sql.*;
public class GET_OS_DIR_JAVA
{
public static void getOSDirAndFile(String directory)throws SQLException
{
File path = new File(directory);
String[] fileList = path.list();
String fileName;
long fileSize;
long fileDate;
#sql{ truncate table OS_DIR};
for(int i = 0; i < fileList.length; i++)
{
fileName = fileList[i];
File fpath = new File(directory + '/' + fileName);
fileSize = fpath.length();
fileDate = fpath.lastModified();
#sql{ insert into OS_DIR (name, size_byte, modify_date)
values(:fileName, :fileSize, to_date('01/01/1970', 'mm/dd/yyyy') + :fileDate / (24*60*60*1000))};
}
}
public static void getOSDir(String directory)throws SQLException
{
File path = new File(directory);
String[] fileList = path.list();
String fileName;
long fileSize;
long fileDate;
#sql{ truncate table OS_DIR};
for(int i = 0; i < fileList.length; i++)
{
fileName = fileList[i];
File fpath = new File(directory + '/' + fileName);
fileSize = fpath.length();
fileDate = fpath.lastModified();
if(fpath.isFile())
continue;
#sql{ insert into OS_DIR (name, size_byte) values(:fileName, :fileSize)};
}
}
public static void getOSRoot()throws SQLException
{
String rootName;
long rootSize;
File[] roots = File.listRoots();
#sql{ truncate table OS_DIR};
for(int i = 0; i < roots.length; i++)
{
rootName = roots[i].toString();
rootSize = roots[i].length();
#sql{ insert into OS_DIR (name, size_byte) values(:rootName, :rootSize)};
}
}
public static boolean isDirOrFileExist(String directory)throws SQLException
{
File path = new File(directory);
return path.exists();
}
public static boolean isDirectory(String directory)throws SQLException
{
File path = new File(directory);
return path.isDirectory();
}
裏邊實現了 5 個函數。功能分別爲取指定目錄下的目錄和文件、取指定目錄下的目錄、枚舉磁盤所有根目錄、判斷指定文件或目錄是否存在、判斷是不是文件。
接下來就是編寫存儲過程或函數調用 JAVA Resource
CREATE OR REPLACE PROCEDURE SP_GET_OS_DIR_JAVA(p_directory IN VARCHAR2) AS language java name 'GET_OS_DIR_JAVA.getOSDir(java.lang.String)';
CREATE OR REPLACE PROCEDURE SP_GET_OS_DIR_FILE_JAVA(p_directory IN VARCHAR2) AS language java name 'GET_OS_DIR_JAVA.getOSDirAndFile(java.lang.String)';
CREATE OR REPLACE PROCEDURE SP_GET_OS_ROOT_JAVA AS language java name 'GET_OS_DIR_JAVA.getOSRoot()';
CREATE OR REPLACE FUNCTION SP_IS_OS_DIR_FILE_EXIST_JAVA(p_directory IN VARCHAR2) RETURN Boolean AS language java name 'GET_OS_DIR_JAVA.isDirOrFileExist(java.lang.String)return java.lang.Boolean';
CREATE OR REPLACE FUNCTION SP_IS_OS_DIR_JAVA(p_directory IN VARCHAR2) RETURN Boolean AS language java name 'GET_OS_DIR_JAVA.isDirectory(java.lang.String)return java.lang.Boolean';