Oracle 加載的 Java 類需更新時,切勿手動 DROP JAVA SOURCE/PROCEDURE,會導致同義詞、權限、Call Spec 關聯對象失效。標準流程:dropjava → 修改源碼 → loadjava。本文實測記錄完整更新過程與驗證腳本。
-- 1. 卸載舊版本 (自動清理關聯對象)
D:\eclipse3.1\workspace\dbtest> dropjava -u scott/tiger@iihero.oracledb -v OracleJavaProc
-- 2. 修改 Java 源碼 (本地編輯、編譯)
-- OracleJavaProc.java 添加新方法...
-- 3. 加載新版本 (自動重建類、解析依賴、發布 Call Spec)
D:\eclipse3.1\workspace\dbtest> loadjava -u scott/tiger@iihero.oracledb -v -resolve OracleJavaProc.java
-- 輸出示例:
arguments: '-u' 'scott/tiger@iihero.oracledb' '-v' '-resolve' 'OracleJavaProc.java'
creating : source OracleJavaProc
loading : source OracleJavaProc
resolving: source OracleJavaProc
-resolve:加載後立即解析類引用,強烈建議加上,提前暴露缺失依賴 (如第三方 JAR 未加載)。-v:詳細日誌,確認每個類加載狀態。dropjava 會同步刪除:Java Source/Class/Resource、關聯的 PL/SQL 包裝器、公共同義詞、授權權限。-- 1. 發布新增方法為 PL/SQL 函數
CREATE OR REPLACE FUNCTION query_hisal(grade NUMBER) RETURN NUMBER
AS LANGUAGE JAVA
NAME 'OracleJavaProc.getHiSal(int) return int';
/
-- 2. 啟用 Java 輸出重定向
SET SERVEROUTPUT ON SIZE 2000
CALL dbms_java.set_output(2000);
-- 3. 執行測試
SELECT query_hisal(5) FROM dual;
-- 預期結果: 9999 (對應 salgrade 表 grade=5 的 hisal)
-- 錯誤示範
DROP JAVA SOURCE "OracleJavaProc";
DROP PROCEDURE add_sal_grade;
-- 後果:同義詞失效、權限丟失、依賴對象 INVALID,極難清理
loadjava -resolve,否則運行時拋 ClassNotFoundException。| 階段 | 動作 | 驗證點 |
|---|---|---|
| 預發布 | 測試庫全量回測 | 所有現有 Call Spec 正常、新方法邏輯正確 |
| 發布窗口 | 執行 dropjava/loadjava 腳本 | 無解析錯誤、無 ORA-295xx 異常 |
| 發布後 | 煙霧測試關鍵業務 | 新舊會話均正常、應用日志無 Java 異常 |
| 回滾預案 | 保留舊版 .class/JAR | 10 分鐘內可執行 rollback 腳本恢復 |
dropjava → loadjava -resolve 是 Oracle Java 存儲過程更新的唯一標準路徑。它保證數據庫字典一致性、依賴關係完整性、權限傳遞正確性。堅決杜絕手工 DROP,將發布流程腳本化、版本化,納入 CI/CD 流水線,才是專業團隊的選擇。