You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle Apex新手求助:如何通过数据库存储过程调用Java类?

Oracle Apex通过存储过程调用Java类实操指南

下面是从Java类准备到Apex调用的完整步骤,都是实际项目里能用的操作:

1. 编写并编译Java类

先写一个简单的Java测试类(实际项目替换成你的业务逻辑类):

public class MyJavaClass {
    // 示例:返回问候语
    public static String greet(String name) {
        return "Hello, " + name + "!";
    }
    // 示例:两数相加
    public static int addNumbers(int a, int b) {
        return a + b;
    }
}

用javac编译成.class文件:

javac MyJavaClass.java

2. 把Java类加载到Oracle数据库

用Oracle自带的loadjava工具(确保你配置了Oracle客户端环境变量,能直接调用这个命令),把编译好的.class文件上传到数据库:

loadjava -user 你的用户名/密码@数据库地址 MyJavaClass.class

登录数据库验证是否加载成功:

SELECT object_name FROM user_objects WHERE object_type='JAVA CLASS';

如果结果里有MYJAVACLASS,就说明加载成功了。

3. 创建PL/SQL包装存储过程/函数

Apex没法直接调用Java方法,得先写PL/SQL包装器做中转:

-- 对应Java的greet方法,写一个PL/SQL函数
CREATE OR REPLACE FUNCTION java_greet(p_name IN VARCHAR2) RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'MyJavaClass.greet(java.lang.String) return java.lang.String';
/

-- 对应Java的addNumbers方法,写一个PL/SQL存储过程(带输出参数)
CREATE OR REPLACE PROCEDURE java_add(p_a IN NUMBER, p_b IN NUMBER, p_result OUT NUMBER)
AS LANGUAGE JAVA
NAME 'MyJavaClass.addNumbers(int, int) return int';
/

编译完后检查错误:

SHOW ERRORS;

如果没有报错,就可以继续下一步了。

4. 在Apex里调用这个PL/SQL包装器

方法1:在页面Process里调用

在Apex页面中添加一个Process,选择PL/SQL类型,然后写代码:

DECLARE
    v_greeting VARCHAR2(100);
    v_total NUMBER;
BEGIN
    -- 调用Java包装函数,获取问候语
    v_greeting := java_greet('Apex新手');
    -- 调用Java包装存储过程,计算两数之和
    java_add(10, 20, v_total);
    
    -- 把结果赋值给页面项(提前在页面创建好P1_GREETING和P1_TOTAL这两个项)
    :P1_GREETING := v_greeting;
    :P1_TOTAL := v_total;
END;
/

触发这个Process后,页面项就会显示Java方法的返回结果。

方法2:在报表或SQL查询中直接调用函数

如果需要在报表里展示Java方法的结果,可以直接在SQL里调用:

SELECT emp_id, emp_name, java_greet(emp_name) AS emp_greeting FROM employees;

关键注意事项

  • 确保你的数据库用户有足够权限:需要DBA给你授权CREATE JAVA和EXECUTE相关权限,比如:
GRANT CREATE JAVA TO 你的用户名;
GRANT EXECUTE ON SYS.DBMS_JAVA TO 你的用户名;
  • Java和PL/SQL的类型要严格对应:比如Java的int对应PL/SQL的NUMBER,java.lang.String对应VARCHAR2,类型不匹配会报错。
  • 如果Java类需要访问外部资源(比如读文件、发网络请求),得通过DBMS_JAVA.GRANT_PERMISSION给数据库用户授权,或者修改数据库的java.policy文件。

内容的提问来源于stack exchange,提问作者Rana mari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:43:29