Oracle 內置 JVM (OJVM) 允許將 Java 類加載至數據庫,發布為存儲過程。本文以 OracleJavaProc 類為例,演示添加 addSalGrade (增) 與 getHiSal (查) 兩個業務方法的完整開發、加載、發布、測試流程。
import java.sql.*;
import oracle.jdbc.*;
public class OracleJavaProc {
// 1. 新增薪資等級
public static void addSalGrade(int grade, int losal, int hisal) {
System.out.println("Creating new salgrade for EMPLOYEE...");
try (Connection conn = DriverManager.getConnection("jdbc:default:connection:")) {
String sql = "INSERT INTO salgrade (GRADE, LOSAL, HISAL) VALUES (?, ?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, grade);
pstmt.setInt(2, losal);
pstmt.setInt(3, hisal);
pstmt.executeUpdate();
}
} catch (SQLException e) {
System.err.println("ERROR! Adding Salgrade: " + e.getMessage());
}
}
// 2. 查詢最高薪資
public static int getHiSal(int grade) {
try (Connection conn = DriverManager.getConnection("jdbc:default:connection:")) {
String sql = "SELECT hisal FROM salgrade WHERE grade = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, grade);
try (ResultSet rset = pstmt.executeQuery()) {
if (rset.next()) {
return rset.getInt(1);
}
}
}
} catch (SQLException e) {
System.err.println("ERROR! Querying Salgrade: " + e.getMessage());
}
return -1; // 未找到或異常
}
}
jdbc:default:connection: 獲取當前會話的隱式連接,無需用戶名密碼,事務自動融入調用者。System.err,OJVM 會導向 Trace 文件,便於排查。-- 1. 刪除舊版本 (清理舊類、同義詞、發布的 PL/SQL 包裝器)
dropjava -u scott/tiger@orcl -v OracleJavaProc
-- 2. 編譯 Java 源文件 (本地編譯確保語法無誤)
javac OracleJavaProc.java
-- 3. 加載並發布到數據庫
loadjava -u scott/tiger@orcl -v -resolve OracleJavaProc.class
-- 發布 void 方法為 PROCEDURE
CREATE OR REPLACE PROCEDURE add_sal_grade (
p_grade IN NUMBER,
p_losal IN NUMBER,
p_hisal IN NUMBER
) AS LANGUAGE JAVA
NAME 'OracleJavaProc.addSalGrade(int, int, int)';
/
-- 發布 int 返回方法為 FUNCTION
CREATE OR REPLACE FUNCTION get_hi_sal (p_grade IN NUMBER) RETURN NUMBER
AS LANGUAGE JAVA
NAME 'OracleJavaProc.getHiSal(int) return int';
/
-- 1. 開啟 DBMS_OUTPUT
SET SERVEROUTPUT ON SIZE 2000
CALL dbms_java.set_output(2000);
-- 2. 測試新增
EXEC add_sal_grade(5, 1000, 9999);
-- 3. 測試查詢
SELECT get_hi_sal(5) FROM dual;
-- 預期輸出: 9999
System.out.println 輸出導向 DBMS_JAVA.SET_OUTPUT;複雜邏輯可用 DBMS_JAVA.SET_COMPILER_OPTION 開啟遠程調試端口。Drop → Compile → Load → Publish → Test 五步法構建 Oracle Java 存儲過程標準化流程。核心優勢:業務邏輯用 Java 表達豐富、生態工具鏈成熟;數據訪問用默認連接零配置、事務自動融合。適合複雜計算、外部 API 調用、XML/JSON 處理等 PL/SQL 不擅長的場景。