oracle调⽤java⽅法
在历史数据迁移中遇到的问题:原数据库中的某些字段使⽤了des加密,但是在新数据库中要求保存明⽂,如果不想通过程序刷表解决问题,就可以使⽤oracle的调⽤java⽅法功能。
1.查看oracle的版本,命令查看版本信息,获取oracle内置的jre版本。
SELECT * FROM V$VERSION;
我的数据库是oracle12c,对应的jre版本是java6,oracle内置的java版本较低,具体对应关系可以⾃⾏百度。当然你也可以到oracle的安装⽬录,⽐如我的安装⽬录为: F:\app\Administrator\product\12.1.0\dbhome_1\jdk\jre,到jre⽂件夹进⼊bin执⾏java -version。
2.java编码
获取到jre的版本之后,在IDE中修改默认JDK,更改为oracle对应版本,然后开始编码,⽐如我的加解密⽅法需要两个类组成,可以这样编写:
两个类结构如图,这两个类直接在src下⾯,通过DesUtilsTest类调⽤DesUtils类的decrypt⽅法。
两个类具体内容如下:
/**
* 加解密的⽅法调⽤类 st()为调⽤⽅法
*/
public class DesUtilsTest {
public static void main(String[] args){
System.out.println(test("0f2f735790e41b17;"));
}
public static String test(String data){
try{
java replace方法String msg ="";
DesUtils desUtils =new DesUtils();
String[] arr = data.split(";");
if(arr.length >0){
for(String str : arr){
msg = msg + desUtils.decrypt(str,"UTF-8");
}
}else{
msg = desUtils.decrypt(data,"UTF-8");
}
return msg;
}catch(Exception e){
return"异常";
}
}
}
import BASE64Decoder;
import Cipher;
import SecretKey;
import SecretKeyFactory;
import DESedeKeySpec;
/**
* 加解密⼯具类
*/
public class DesUtils {
public BASE64Decoder decoder =new BASE64Decoder();
public SecretKey getKey(String key)throws Exception {
DESedeKeySpec dks =new DESedeKeySpec(decoder.decodeBuffer(key)); SecretKeyFactory keyFactory = Instance("DESede"); SecretKey securekey = ateSecret(dks);
return securekey;
}
public String decrypt(String text, String charset)throws Exception {
Cipher cipher = Instance("DESede/ECB/PKCS5Padding");
cipher.init(2,getKey("6eC/Shrj3F7W9x+F6Q1og29u9NpGYu/I"));
byte[] textBytes =parseHexStr2Byte(text);
byte[] bytes = cipher.doFinal(textBytes);
String decryptString =new String(bytes, charset);
return decryptString;
}
public byte[]parseHexStr2Byte(String hexStr){
if(hexStr.length()<1){
return null;
}else{
byte[] result =new byte[hexStr.length()/2];
for(int i =0; i < hexStr.length()/2;++i){
int high = Integer.parseInt(hexStr.substring(i *2, i *2+1),16);
int low = Integer.parseInt(hexStr.substring(i *2+1, i *2+2),16);
result[i]=(byte)(high *16+ low);
}
return result;
}
}
}
3.编译、打包
将这两个⽂件编译成class⽂件,然后执⾏cmd命令 jar -cvf DesUtilsTest.jar ./
命令执⾏成功后会在当前⽂件夹⽣成DesUtilsTest.jar⽂件
4.将jar包导⼊oracle中
⾸先把刚才⽣成的jar包放⼊C:\Users\MPF\Desktop\dljz-server⽂件夹下⾯(位置你随便放,我是为了省事) 打开cmd窗⼝,执⾏以下命令
-
- 导⼊jar 导⼊成功后可以通过SQL查看: SELECT * FROM USER_JAVA_CLASSES;
loadjava -r -f -verbose -resolve -user⽤户名/密码@//IP:1521/orcl C:\Users\MPF\Desktop\dljz-server\DesUtilsTest.jar
-- 重新上传时要先删除jar 再导⼊
dropjava -r -f -verbose -resolve -user⽤户名/密码@//IP:1521/orcl C:\Users\MPF\Desktop\dljz-server\DesUtilsTest.jar
5.在oracle中创建函数
-- 创建函数
CREATE OR REPLACE FUNCTION"GETDECDATA"(DECDATA VARCHAR2)RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'st(java.lang.String) return java.lang.String';
创建完成后就可以查询使⽤了
-
- 查询解密后的数据
SELECT GETDECDATA(F_FZR), GETDECDATA(F_SFZH), GETDECDATA(F_JGMC)FROM TB_TEMP
注意事项:
2.在被调⽤的⽅法中,如果该⽅法还依赖其他类,那么其他类必须要new,⽽不是通过static使⽤类名调⽤(我使⽤类名+静态⽅法形式调⽤⼀直出错,也可能是我没有操作对,⽤new就没问题了)。
3.java类的包结构应该尽量简单,不要包裹太多层级,⽐如st.DesUtils,这样就⽐较长了,建议去除前⾯,直接使⽤DesUtils。
4.在调⽤过程中如果出现类似需要授权的操作,就根据他的提⽰⽤call调⽤⼀下,⽐如:
call ant_permission('DLJZ','SYS:java.lang.RuntimePermission','accessClassInPackage.sun.misc','')
最后:我测试过java⽂件、class⽂件都没有成功,只有jar成功了,可能之前是操作有问题,也请各位予以指正。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论