使用 Oracle JVM (内置在 Oracle 数据库中)
这是 Oracle 数据库原生提供的方法,无需安装额外的第三方软件,它允许你直接在 SQL 或 PL/SQL 中调用 Java 代码。

工作流程概览
- 编写 Java 代码:创建一个 Java 类,其中包含
public static方法,这些方法将是可被调用的函数。 - 编译 Java 代码:使用
javac编译.java文件,生成.class文件。 - 加载 Java 类到数据库:使用
loadjava命令行工具或 PL/SQL 包(如DBMS_JAVA)将.class文件加载到数据库的SYS模式下。 - 创建 SQL 对象(可选但推荐):创建一个 SQL 对象(如
FUNCTION或PROCEDURE),作为 PL/SQL 和 Java 代码之间的桥梁,这可以隐藏 Java 的复杂性,并简化权限管理。 - 调用 Java 函数:在 SQL 语句或 PL/SQL 块中调用你创建的 SQL 对象。
详细步骤与示例
示例目标:创建一个 Java 函数,计算两个整数的和,并在 Oracle 中调用它。
步骤 1:编写 Java 代码
创建一个名为 MyCalculator.java 的文件。
// MyCalculator.java
package com.example.oracle;
public class MyCalculator {
/**
* 一个静态方法,用于计算两个整数的和。
* 注意:必须是 public static,并且参数和返回类型必须是 Oracle 支持的类型。
* @param a 第一个整数
* @param b 第二个整数
* @return 两个整数的和
*/
public static int add(int a, int b) {
System.out.println("Java 方法 add() 被调用,参数: a=" + a + ", b=" + b);
return a + b;
}
}
关键点:
- 方法必须是
public static。 - 参数和返回值类型必须是 Oracle JVM 支持的类型,如基本类型 (
int,double,String) 或它们的包装类 (Integer,Double)。
步骤 2:编译 Java 代码
在你的本地机器上编译这个文件。
# 确保 CLASSPATH 环境变量已设置,或者使用 -cp 指定 Oracle 数据库的 JDBC 驱动(如果需要) # 对于这个简单示例,通常不需要额外的 JDBC 驱动 javac MyCalculator.java
这会生成 MyCalculator.class 文件。

步骤 3:加载 Java 类到数据库
使用 loadjava 命令行工具,你需要有 CREATE JAVA 系统权限。
# loadjava 命令格式 # loadjava -user <username>/<password>@<database_connection_string> <class_file_path> # 示例 loadjava -user system/oracle@localhost:1521/XE MyCalculator.class
执行后,你可以查询 USER_OBJECTS 视图来确认加载成功。
SELECT object_name, object_type, status FROM user_objects WHERE object_name = 'MYCALCULATOR';
步骤 4:创建 SQL 函数作为桥梁
为了让 PL/SQL 调用起来更方便,我们创建一个 SQL 函数,这需要 CREATE PROCEDURE 权限。
CREATE OR REPLACE FUNCTION my_add_function (p_num1 IN NUMBER, p_num2 IN NUMBER) RETURN NUMBER AS LANGUAGE JAVA NAME 'com.example.oracle.MyCalculator.add(int, int)'; /
语法解析:

CREATE OR REPLACE FUNCTION ...:标准的 PL/SQL 函数定义。AS LANGUAGE JAVA:指定此函数是用 Java 实现的。NAME '...':这是关键,它指定了要调用的 Java 方法的完整签名。- 格式为
'fully.qualified.class.name.methodName(param1_type, param2_type)'。 com.example.oracle.MyCalculator是类名。add是方法名。int, int是参数类型,注意,这里使用的是 Java 的类型名称。
- 格式为
步骤 5:调用 Java 函数
你可以像调用任何内置的 Oracle 函数一样调用它。
-- 在 SQL 查询中调用
SELECT my_add_function(10, 20) AS sum_result FROM dual;
-- 在 PL/SQL 块中调用
DECLARE
v_result NUMBER;
BEGIN
v_result := my_add_function(100, 200);
DBMS_OUTPUT.PUT_LINE('计算结果是: ' || v_result);
END;
/
输出:
SUM_RESULT
----------
30
计算结果是: 300
数据库的日志或 PL/Java 是一个更现代、更易于使用的开源项目,它将标准的 Java 运行时环境嵌入到 PostgreSQL 中,并且有社区支持将其移植到 Oracle 上,它提供了更符合 Java 习惯的编程模型,例如使用注解来定义 SQL 函数。 你需要将 PL/Java 的 JAR 文件添加到你的项目依赖中,然后创建 Java 类。 关键点: 你的 然后执行 PL/Java 提供了方便的 SQL 命令来部署 JAR。 部署完成后,PL/Java 会自动注册带有 在实际项目中,请务必考虑安全性、性能和维护性,将复杂的业务逻辑放在数据库中可以减少数据传输,但也要注意不要过度使用,以免使数据库变得臃肿和难以维护。DBMS_OUTPUT 中也会打印出 Java 方法中的 System.out.println
使用 PL/Java (第三方开源方案)
优势
.jar 文件进行部署。工作流程概览
@SQLFunction 等注解来标记要暴露给 SQL 的方法。.jar 文件。DBMS_JAVA 或 PL/Java 提供的 SQL 命令将 .jar 文件部署到数据库。
详细步骤与示例 (PL/Java)
示例目标:与方法一相同,计算两个整数的和。
步骤 1:编写 Java 代码
// MyPlJavaCalculator.java
import org.postgresql.pljava.annotation.Function;
public class MyPlJavaCalculator {
/**
* 使用 @Function 注解将此方法暴露为 SQL 函数。
* name 属性指定在 SQL 中调用的函数名。
* @param a 第一个整数
* @param b 第二个整数
* @return 两个整数的和
*/
@Function(name = "pljava_add")
public static int add(int a, int b) {
System.out.println("PL/Java 方法 add() 被调用,参数: a=" + a + ", b=" + b);
return a + b;
}
}
@Function 注解来定义 SQL 函数。name 属性指定了在 SQL 中调用的函数名(pljava_add)。步骤 2:构建项目 (以 Maven 为例)
pom.xml 文件需要包含 PL/Java 的依赖。<dependencies>
<!-- PL/Java 的 API 和实现 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>pljava-api</artifactId>
<version>1.6.0</version> <!-- 使用与你的 PL/Java 版本匹配的版本 -->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
mvn package 命令,生成 your-project-1.0.jar。步骤 3:部署 JAR 到数据库
-- 删除旧的部署(如果存在)
SELECT sqlj.remove_class('my_pljava_calculator');
-- 部署新的 JAR 文件
-- 注意:你需要将 '/path/to/your-project-1.0.jar' 替换为实际的文件路径
SELECT sqlj.install_jar('file:/path/to/your-project-1.0.jar', 'my_pljava_calculator', true);
-- 将部署的 JAR 添加到类路径中
SELECT sqlj.set_classpath('my_pljava_calculator', 'my_pljava_calculator');
步骤 4:调用 Java 函数
@Function 注解的方法,你可以直接调用它。-- 在 SQL 查询中调用
SELECT pljava_add(50, 60) AS sum_result FROM dual;
-- 在 PL/SQL 块中调用
DECLARE
v_result NUMBER;
BEGIN
v_result := pljava_add(500, 600);
DBMS_OUTPUT.PUT_LINE('PL/Java 计算结果是: ' || v_result);
END;
/
两种方法的对比
特性
Oracle JVM (内置)
PL/Java (第三方)
依赖性
无需额外安装,是 Oracle 数据库的一部分。
需要单独下载、安装和配置 PL/Java。
开发工具
手动编译,使用
loadjava,过程相对繁琐。标准的 Java 开发工具链 (Maven/Gradle),更现代化。
部署
加载
.class 文件。部署
.jar 文件,更方便管理依赖。
编程模型
手动定义 SQL 函数,映射到 Java 方法。
使用
@Function 等注解,更直观。
权限管理
需要
CREATE JAVA 等高权限。权限模型可能更精细,但通常也需要管理员权限来部署。
社区与支持
Oracle 官方支持,但属于数据库核心的一部分,变更较慢。
开源社区支持,更新活跃,功能迭代快。
适用场景
已有环境、简单的功能集成、Oracle 技术栈统一。
复杂的 Java 应用逻辑、需要使用现代 Java 库、追求开发效率。
