首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle Java 存儲過程開發實戰:向 OracleJavaProc 類添加業務方法完整流程

     編輯:Oracle 資料庫基礎

前言

Oracle 內置 JVM (OJVM) 允許將 Java 類加載至數據庫,發布為存儲過程。本文以 OracleJavaProc 類為例,演示添加 addSalGrade (增) 與 getHiSal (查) 兩個業務方法的完整開發、加載、發布、測試流程。

一、 Java 類源碼實現

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: 獲取當前會話的隱式連接,無需用戶名密碼,事務自動融入調用者。
  • 資源管理:使用 try-with-resources (JDK 7+) 自動關閉 Connection/Statement/ResultSet,防洩漏。
  • 異常處理:捕獲 SQLException 寫入 System.err,OJVM 會導向 Trace 文件,便於排查。

二、 部署三部曲:Drop → Compile → Load

-- 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

三、 PL/SQL 發布包裝器 (Call Spec)

-- 發布 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

五、 進階最佳實踐

  1. 連接池復用:OJVM 內部復用會話連接,無需手動管理池。
  2. 事務邊界:Java 方法不提交/回滾,由調用者 (PL/SQL 或客戶端) 控制事務邊界。
  3. 權限模型:Java 類以定義者權限運行 (AUTHID DEFINER),需授予底層表操作權限給類擁有者。
  4. 調試技巧: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 不擅長的場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved