如何在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
相关产品推荐
相关产品推荐

