点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!
说 明
在实际工作中,有时Oracle内置函数可能无法满足特定的数据处理需求。此时,我们可以通过自定义函数来弥补这些不足。
例如,对于SM4数据的加解密,由于其算法较为复杂,Oracle内置函数或通过CREATE FUNCTION语句无法实现。在这种情况下,我们可以通过结合Java和Oracle来实现这一功能。
项目打包
将编写的java代码进行打包,oracle版本(以11.0.2为例)与打包使用的JDK版本要对应,例如oracle的11.0.2版本使用的JDK版本为1.5,那我们项目打包使用的JDK也需要是1.5。
首先查看项目编译所用的JDK版本,命令如下:
javap -v E:\yourpath\xxx.class
复制

可以看到major version:52,这就说明我们编译使用的JDK版本是1.8,对应关系如下:
JDK 1.8 = 52,
JDK 1.7= 51,
JDK 1.6= 50,
JDK 1.5 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45复制
与Oracle的11.0.2JDK版本不一致,这就需要我们从新对项目打包,可以通过修改maven的settings文件来修改。
注意:自定义函数必须是static修饰的。
创建自定义函数
上传jar包,通过loadjava命令:
loadjava -r -f -resolve -user user/password yourpath/xxxxx.jar
复制
创建自定义函数:
create or replace function
decrypt_sm4(plainText nvarchar2)
return varchar2 as
LANGUAGE JAVA NAME
'org/example/sm4/Sm4Kit.decrypt_sm4(java.lang.String)
return java.lang.String';复制
其中decrypt_sm4为函数名称,可以随意定义,plainText 为参数,与java中函数参数数量与数据类型保持一致;
org/example/sm4/Sm4Kit.decrypt_sm4(java.lang.String)为java中自定义函数包名;
return java.lang.String为返回数据类型。
使用说明
一旦自定义函数被成功创建,便能够将其与内置函数一样,无缝地融入到自己的查询中。
以下是一个示例说明如何使用自定义的加解密函数:
SELECT decrypt_sm4(phone)
FROM user
WHERE name = '张三';复制
在此查询中,decrypt_sm4 是一个自定义函数,用于对 user 表中 phone 列的值进行SM4解密,条件表达式检查 name 列是否等于字符串 ‘张三’。
这样的自定义函数扩展了Oracle的功能性,使得复杂的操作如同简单的数据查询一样便捷。

本文作者:智 源(上海新炬中北团队)
本文来源:“IT那活儿”公众号
