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

如何在Oracle EBS R11中添加Java库以在SQL中调用Java代码

在Oracle SQL中调用依赖第三方库的Java代码:库部署与路径指南

问题描述

我有一段依赖Starkbank椭圆曲线库的Java签名代码,想要在Oracle SQL中调用,但不清楚服务器上第三方Java库的添加方式和具体路径。我找到一个名为lib的文件夹,不确定这是不是存放.jar文件的正确目录,还有没有其他可选目录?

我的Java代码

import com.starkbank.ellipticcurve.PrivateKey;
import com.starkbank.ellipticcurve.PublicKey;
import com.starkbank.ellipticcurve.Signature;
import com.starkbank.ellipticcurve.Ecdsa;
import com.starkbank.ellipticcurve.utils.ByteString;
import com.starkbank.ellipticcurve.utils.File;
import java.util.*;
import java.util.Base64;

public class NewClass3{

    public static void main(String[] args){
        // 读取私钥文件
        String PrivKeyPem = File.read("ec-secp256k1-priv-key.pem");
        
        PrivateKey privateKey = PrivateKey.fromPem(PrivKeyPem);
        
        Base64.Encoder enc = Base64.getEncoder();
        Base64.Decoder dec = Base64.getDecoder();
        
        String str = "LcHeQ9b2bhNW291aOgeXhBHKa1uHmNoKf/ATfX+AJbo=";

        // 解码数据
        String decoded = new String(dec.decode(str));
        System.out.println("decoded value is \t" + decoded);
        System.out.println("original value is \t" + str);
        
        // 生成签名
        Signature signature = Ecdsa.sign(decoded, privateKey);
        System.out.println("signature: " + signature);

        // Base64编码签名(用于QR码)
        String base64 = signature.toBase64();
        System.out.println("Encoded String:\n" + base64);
    }
}

解决方案

一、Oracle服务器上Java库的可选部署目录

  • Oracle官方目录:默认的第三方Java库存放目录为$ORACLE_HOME/jlib或$ORACLE_HOME/lib,你找到的lib文件夹如果属于Oracle安装目录的子目录,可直接使用,但需确保Oracle进程对该目录有读取权限。
  • 自定义目录:可创建独立目录(如/opt/oracle/custom_jars)存放jar包,但后续加载类时需明确指定路径。
  • 数据库内部存储:通过loadjava工具将jar包加载到数据库中,完全脱离服务器文件系统依赖,是Oracle调用Java代码的推荐方式。

二、部署Starkbank库并实现SQL调用的步骤

1. 加载第三方库到数据库

使用Oracle自带的loadjava工具,将Starkbank的jar包导入数据库:

loadjava -user 用户名/密码@数据库实例 -resolve starkbank-ellipticcurve.jar
  • -resolve参数会自动处理类依赖,确保所有关联类正确加载。
  • 若存在多个依赖jar包,需一次性全部加载。

2. 调整并加载自定义Java类

修改你的Java代码,将main方法改为可被SQL调用的静态方法(移除控制台输出,返回签名结果):

import com.starkbank.ellipticcurve.PrivateKey;
import com.starkbank.ellipticcurve.Signature;
import com.starkbank.ellipticcurve.Ecdsa;
import com.starkbank.ellipticcurve.utils.File;
import java.util.Base64;

public class NewClass3{
    public static String generateSignature(String inputStr) {
        String privKeyPem = File.read("/绝对路径/ec-secp256k1-priv-key.pem");
        PrivateKey privateKey = PrivateKey.fromPem(privKeyPem);
        
        Base64.Decoder dec = Base64.getDecoder();
        String decoded = new String(dec.decode(inputStr));
        
        Signature signature = Ecdsa.sign(decoded, privateKey);
        return signature.toBase64();
    }
}

编译后用loadjava加载到数据库:

loadjava -user 用户名/密码@数据库实例 -resolve NewClass3.class

3. 创建PL/SQL包装函数

在SQL中创建函数,映射Java方法:

CREATE OR REPLACE FUNCTION generate_signature(input_str VARCHAR2) RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'NewClass3.generateSignature(java.lang.String) return java.lang.String';

4. 在SQL中调用

直接调用PL/SQL函数即可:

SELECT generate_signature('LcHeQ9b2bhNW291aOgeXhBHKa1uHmNoKf/ATfX+AJbo=') AS signature FROM DUAL;

三、关键注意事项

  • 权限要求:执行loadjava需要数据库的CREATE PROCEDURE和CREATE JAVA权限。
  • 文件路径:读取私钥文件时必须使用绝对路径,且Oracle数据库进程需对该路径有读取权限。
  • 依赖排查:若出现类找不到的错误,使用loadjava -verbose参数查看加载日志,确认依赖是否完整。

内容的提问来源于stack exchange,提问作者MK Said

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:35:36