-- 1. 編譯並載入 Java Source
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "JavaDemo1" AS
import java.sql.*;
public class JavaDemo1 {
public static void main(String[] argv) {
System.out.println("hello, Java demo1");
}
};
/
-- 2. 檢查編譯錯誤
SHOW ERRORS JAVA SOURCE "JavaDemo1";
-- 3. 建立 PL/SQL Wrapper Procedure
CREATE OR REPLACE PROCEDURE JavaDemo1
AS LANGUAGE JAVA NAME 'JavaDemo1.main(java.lang.String[])';
/
-- 4. 執行與輸出導向
SET SERVEROUTPUT ON SIZE 5000;
CALL DBMS_JAVA.SET_OUTPUT(5000);
CALL JavaDemo1();
-- 輸出: hello, Java demo1
關鍵要求:方法必須 public static,參數型別對應 Java 陣列 String[]。
-- 1. 準備 .class 檔放置於資料庫伺服器目錄
-- public class OracleJavaProc { public static void main(String[] argv) { ... } }
-- 2. 建立 Directory Object 指向該目錄 (需 CREATE ANY DIRECTORY 權限)
GRANT CREATE ANY DIRECTORY TO scott;
CONNECT scott/tiger@orcl;
CREATE OR REPLACE DIRECTORY test_dir AS 'd:\oracle'; -- Windows 路徑
-- 3. 從 BFILE 載入 Class
CREATE OR REPLACE JAVA CLASS USING BFILE (test_dir, 'OracleJavaProc.class');
/
-- 4. 建立 Wrapper Procedure
CREATE OR REPLACE PROCEDURE testJavaproc
AS LANGUAGE JAVA NAME 'OracleJavaProc.main(java.lang.String[])';
/
-- 5. 執行
SET SERVEROUTPUT ON SIZE 5000;
CALL DBMS_JAVA.SET_OUTPUT(5000);
CALL testJavaproc();
-- 或 EXEC testJavaproc;
# 載入單一 .class
loadjava -user scott/tiger@orcl -resolve OracleJavaProc.class
# 載入整個 JAR
loadjava -user scott/tiger@orcl -resolve myapp.jar
# 移除
dropjava -user scott/tiger@orcl OracleJavaProc.class
優點:支援 JAR、自動解析相依、命令列自動化部署、CI/CD 整合友善。
| 權限類型 | 授予語法 | 說明 |
|---|---|---|
| JVM 執行權限 | GRANT JAVASYSPRIV TO user | 允許呼叫 java.lang.System 等系統類 |
| 檔案 I/O 權限 | CALL DBMS_JAVA.GRANT_PERMISSION('USER','java.io.FilePermission','/tmp/*','read,write') | 細粒度檔案存取控制 |
| 網路 Socket 權限 | CALL DBMS_JAVA.GRANT_PERMISSION('USER','java.net.SocketPermission','host:port','connect,resolve') | 允許 Java 代碼發起網路連線 |
| 執行 PL/SQL 權限 | Java 中呼叫 oracle.jdbc.driver.OracleDriver.defaultConnection() 取得隱性連線 | 同 Session 交易內容,無需重新登入 |
java.util.regex 功能遠強於 REGEXP_LIKE。SHOW ERRORS JAVA SOURCE/CLASS "name":編譯錯誤SELECT * FROM USER_JAVA_CLASSES:已載入類別清單SELECT * FROM USER_ERRORS WHERE TYPE='JAVA SOURCE':錯誤明細DBMS_JAVA.SET_OUTPUT → DBMS_OUTPUT 顯示-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 (需重啟資料庫,僅限開發環境)PreparedStatement.addBatch) 寫入。defaultConnection() 共用 Session。JAVA_POOL_SIZE 控制,大量載入 Class/JAR 需調大。