杰瑞科技汇

Oracle如何调用Java函数?

使用 Oracle JVM (内置在 Oracle 数据库中)

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

Oracle如何调用Java函数?-图1
(图片来源网络,侵删)

工作流程概览

  1. 编写 Java 代码:创建一个 Java 类,其中包含 public static 方法,这些方法将是可被调用的函数。
  2. 编译 Java 代码:使用 javac 编译 .java 文件,生成 .class 文件。
  3. 加载 Java 类到数据库:使用 loadjava 命令行工具或 PL/SQL 包(如 DBMS_JAVA)将 .class 文件加载到数据库的 SYS 模式下。
  4. 创建 SQL 对象(可选但推荐):创建一个 SQL 对象(如 FUNCTIONPROCEDURE),作为 PL/SQL 和 Java 代码之间的桥梁,这可以隐藏 Java 的复杂性,并简化权限管理。
  5. 调用 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 文件。

Oracle如何调用Java函数?-图2
(图片来源网络,侵删)

步骤 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)';
/

语法解析

Oracle如何调用Java函数?-图3
(图片来源网络,侵删)
  • 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

数据库的日志或 DBMS_OUTPUT 中也会打印出 Java 方法中的 System.out.println


使用 PL/Java (第三方开源方案)

PL/Java 是一个更现代、更易于使用的开源项目,它将标准的 Java 运行时环境嵌入到 PostgreSQL 中,并且有社区支持将其移植到 Oracle 上,它提供了更符合 Java 习惯的编程模型,例如使用注解来定义 SQL 函数。

优势

  • 开发体验更佳:使用标准的 Maven/Gradle 进行构建和依赖管理。
  • 更简单的部署:通常打包成一个 .jar 文件进行部署。
  • 更强大的功能:支持更复杂的 Java API 和库。

工作流程概览

  1. 设置 PL/Java 环境:下载 PL/Java 的 Oracle 版本,并在数据库中进行安装和配置。
  2. 编写 Java 代码:使用 @SQLFunction 等注解来标记要暴露给 SQL 的方法。
  3. 构建项目:使用 Maven 或 Gradle 编译项目,并打包成一个 .jar 文件。
  4. 部署 JAR 到数据库:使用 DBMS_JAVA 或 PL/Java 提供的 SQL 命令将 .jar 文件部署到数据库。
  5. 调用函数:直接在 SQL 中调用带有注解的 Java 方法。

详细步骤与示例 (PL/Java)

示例目标:与方法一相同,计算两个整数的和。

步骤 1:编写 Java 代码

你需要将 PL/Java 的 JAR 文件添加到你的项目依赖中,然后创建 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 到数据库

PL/Java 提供了方便的 SQL 命令来部署 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 函数

部署完成后,PL/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 库、追求开发效率。
  • 如果你只是想快速实现一个简单的功能,并且你的环境是标准的 Oracle 数据库,方法一(Oracle JVM) 是最直接的选择。
  • 如果你计划进行复杂的 Java 开发,需要使用大量的第三方库(如 Apache Commons, Guava 等),并且希望利用现代 Java 生态和工具,方法二(PL/Java) 会是更好的选择,尽管它的初始配置成本稍高。

在实际项目中,请务必考虑安全性、性能和维护性,将复杂的业务逻辑放在数据库中可以减少数据传输,但也要注意不要过度使用,以免使数据库变得臃肿和难以维护。

分享:
扫描分享到社交APP
上一篇
下一篇