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

Oracle資料庫Java預存程序建立與部署完整教學

     編輯:Oracle 資料庫基礎

本文以 Oracle 為例,詳細介紹 Java 預存程序的三種建立方法、部署步驟與實際呼叫測試流程,適合欲在資料庫層直接執行 Java 邏輯的開發人員參考。

一、三種建立 Java 預存程序的方法

方法 1:直接使用 SQL 語句內嵌 Java 原始碼

SQL> CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Javademo1" AS
  2  import java.sql.*;
  3  public class JavaDemo1 {
  4    public static void main(String[] argv) {
  5      System.out.println("hello, Java demo1");
  6    }
  7  }
  8  /

Java 已建立。

SQL> SHOW ERRORS JAVA SOURCE "Javademo1"
無錯誤。

SQL> CREATE OR REPLACE PROCEDURE Javademo1
  2  AS LANGUAGE JAVA NAME 'JavaDemo1.main(java.lang.String[])';
  3  /

程序已建立。

SQL> SET SERVEROUTPUT ON
SQL> CALL Javademo1();
調用完成。

SQL> CALL DBMS_JAVA.SET_OUTPUT(5000);
調用完成。

SQL> CALL Javademo1();
hello, Java demo1
調用完成。

重點: 類別方法必須為 `public static` 才能作為預存程序呼叫;需呼叫 `DBMS_JAVA.SET_OUTPUT` 啟用輸出重導向至 SQL*Plus 終端。

方法 2:使用外部編譯好的 Class 檔案載入

先將編譯好的 `.class` 檔放置 Oracle Server 目錄(如 `d:\Oracle\OracleJavaProc.class`),再建立目錄物件並載入:

SQL> GRANT CREATE ANY DIRECTORY TO scott;
SQL> CREATE OR REPLACE DIRECTORY test_dir AS 'd:\Oracle';
SQL> CREATE OR REPLACE JAVA CLASS USING BFILE(test_dir, 'OracleJavaProc.CLASS');
SQL> CREATE OR REPLACE PROCEDURE testjavaproc AS LANGUAGE JAVA NAME 'OracleJavaProc.main(java.lang.String[])';

同樣需設定 `SERVEROUTPUT` 與 `DBMS_JAVA.SET_OUTPUT` 才能看見輸出。

方法 3:使用 loadjava 工具載入(補充說明)

實務上常用 `loadjava` 命令列工具直接將 `.java` 或 `.class` / `.jar` 載入資料庫,再建立 Call Spec(呼叫規格)連結至 PL/SQL 程序,此法支援依賴管理與解析度檢查,較適合正式環境部署。

二、關鍵設定與除錯提醒

  • 輸出重導向: 必須執行 `CALL DBMS_JAVA.SET_OUTPUT(buffer_size)` 並 `SET SERVEROUTPUT ON SIZE buffer_size`,Java `System.out.println` 內容才會顯示於用戶端
  • 權限需求: 執行 Java 需 `JAVASYSPRIV` 或具體檔案/網路權限(透過 `DBMS_JAVA.GRANT_PERMISSION` 設定)
  • 編碼一致性: Java 原始碼編碼、資料庫字符集、用戶端 NLS_LANG 三者需一致,避免中文亂碼
  • 效能考量: Java 預存程序在資料庫 JVM 中執行,適合資料密集型邏輯,減少網路往返;但大量運算或長時間執行可能佔用共享資源,需評估

三、實務應用場景

  • 複雜資料轉換/驗證邏輯封裝於資料庫層
  • 呼叫外部 REST API、發送郵件、檔案處理等作業系統層操作
  • 重用既有 Java 程式庫(加密、報表產生、規則引擎等)
  • 觸發器中執行非 PL/SQL 邏輯
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved