Oracle导入JAR包并调用Java

遇到Oracle的一个需求,其中有一列数据一下这种格式

121.41139320800005,31.29436885000007,121.41206283000008,31.29457611400005,121.41286000000002,31.293082750000053,121.411515441,31.292933945000073,121.41139320800005,31.29436885000007

现在需要把其转换为json格式 :

[{"lat":"121.41139320800005","lng":"31.29436885000007"},{"lat":"121.41206283000008","lng":"31.29457611400005"},{"lat":"121.41286000000002","lng":"31.293082750000053"},{"lat":"121.411515441","lng":"31.292933945000073"},{"lat":"121.41139320800005","lng":"31.29436885000007"}]

并且需要找出各经度最大最小。


如果按一般的sql  或者 存储过程去做 会很麻烦,之后想到是是否可以像hive一样用写udf函数的形式,写一个函数来获取值。


果然,在Oracle中也是可以用java 自定义函数。


开始的时候把原始数据导入到一个对象中,然后使用阿里fastjson ,但是在loadjava 的时候报错,在网上找了些原因,主要是Oracle的jvm  版本比较低,仅支持jdk1.4版本,所有现在使用高版本的java语法或者高版本jdk编译,都是会报错的。所以现在应用其他的jar包,现在大部分是使用的是在1.4版本以上,所以一般会报错。所以我只能使用原生版本的jdk1.4的语法来写编译了。

编写的java代码如下:

package com.eastcom.one.oracle;

import java.util.ArrayList;
import java.util.List;

public class TransformUtils {

	private final static String LAT_LNG_JSON = "json";
	private final static String MAX_LAT = "max_lat";
	private final static String MIN_LAT = "min_lat";
	private final static String MAX_LNG = "max_lng";
	private final static String MIN_LNG = "min_lng";

	public static String toJSONString(String line) {

		List datas = new ArrayList(100);

		String[] ltems = line.split(",");

		for (int i = 0; i < ltems.length; i++) {

			datas.add(Pair.of(ltems[i], ltems[++i]));

		}

		// String jsonString = JSON.toJSONString(datas);

		// System.out.println(jsonString);

		return null;

	}

	public static String toJSONString2(String line) {

		List datas = new ArrayList(100);

		String[] ltems = line.split(",");

		for (int i = 0; i < ltems.length; i++) {

			datas.add(Pair.of(ltems[i], ltems[++i]));

		}

		String jsonString = makeString(datas);

		String maxLat = getMaxLat(datas);

		getMinLat(datas);

		getMinLng(datas);

		getMaxLng(datas);

		return jsonString;

	}

	public static String getLatAndLngValue(String line, String value) {

		List datas = new ArrayList(100);

		String[] ltems = line.split(",");

		for (int i = 0; i < ltems.length; i++) {

			datas.add(Pair.of(ltems[i], ltems[++i]));

		}

		if (LAT_LNG_JSON.equals(value)) {

			return makeString(datas);
		}

		if (MAX_LAT.equals(value)) {

			return getMaxLat(datas);
		}

		if (MIN_LAT.equals(value)) {

			return getMinLat(datas);
		}

		if (MAX_LNG.equals(value)) {

			return getMaxLng(datas);
		}

		if (MIN_LNG.equals(value)) {

			return getMinLng(datas);
		}

		return null;

	}

	private static String makeString(List datas) {

		StringBuffer sb = new StringBuffer();

		sb.append("[");

		Pair pair = (Pair) datas.get(0);

		String lat = pair.getLat();
		String lng = pair.getLng();

		String latString = "{\"lat\":" + "\"" + lat + "\",";
		String lngString = "\"lng\":" + "\"" + lng + "\"}";

		sb.append(latString).append(lngString);

		for (int i = 1; i < datas.size(); i++) {

			pair = (Pair) datas.get(i);
			lat = pair.getLat();
			lng = pair.getLng();

			latString = ",{\"lat\":" + "\"" + lat + "\",";
			lngString = "\"lng\":" + "\"" + lng + "\"}";

			String tempPair = latString + lngString;

			sb.append(tempPair);
		}

		sb.append("]");
		System.out.println(sb.toString());

		return sb.toString();

	}

	public static String getMaxLat(List datas) {

		Pair pair = (Pair) datas.get(0);

		double maxLat = Double.valueOf(pair.getLat()).doubleValue();

		for (int i = 1; i < datas.size(); i++) {

			pair = (Pair) datas.get(i);

			double latTemp = Double.valueOf(pair.getLat()).doubleValue();

			if (latTemp > maxLat) {
				maxLat = latTemp;
			}

		}

		// System.out.println("maxLat: " + String.valueOf(maxLat));

		return String.valueOf(maxLat);

	}

	public static String getMinLat(List datas) {

		Pair pair = (Pair) datas.get(0);

		double minLat = Double.valueOf(pair.getLat()).doubleValue();

		for (int i = 1; i < datas.size(); i++) {

			pair = (Pair) datas.get(i);

			double latTemp = Double.valueOf(pair.getLat()).doubleValue();

			if (latTemp < minLat) {
				minLat = latTemp;
			}

		}

		// System.out.println("minLat: " + String.valueOf(minLat));

		return String.valueOf(minLat);

	}

	public static String getMaxLng(List datas) {

		Pair pair = (Pair) datas.get(0);

		double maxLng = Double.valueOf(pair.getLng()).doubleValue();

		for (int i = 1; i < datas.size(); i++) {

			pair = (Pair) datas.get(i);

			double lngTemp = Double.valueOf(pair.getLng()).doubleValue();

			if (lngTemp > maxLng) {
				maxLng = lngTemp;
			}

		}

		// System.out.println("maxLng: " + String.valueOf(maxLng));

		return String.valueOf(maxLng);

	}

	public static String getMinLng(List datas) {

		Pair pair = (Pair) datas.get(0);

		double minLng = Double.valueOf(pair.getLng()).doubleValue();

		for (int i = 1; i < datas.size(); i++) {

			pair = (Pair) datas.get(i);

			double lngTemp = Double.valueOf(pair.getLng()).doubleValue();

			if (lngTemp < minLng) {
				minLng = lngTemp;
			}

		}

		// System.out.println("minLng: " + String.valueOf(minLng));

		return String.valueOf(minLng);

	}

	public static void main(String[] args) {

		String line = "121.41139320800005,31.29436885000007,121.41206283000008,31.29457611400005,121.41286000000002,31.293082750000053,121.411515441,31.292933945000073,121.41139320800005,31.29436885000007";

		toJSONString(line);
		toJSONString2(line);

		System.out.println(getLatAndLngValue(line, "max_lat"));
		System.out.println(getLatAndLngValue(line, "min_lat"));
		System.out.println(getLatAndLngValue(line, "max_lng"));
		System.out.println(getLatAndLngValue(line, "min_lng"));

	}

}

其中主要是getLatAndLngValue(String line, String value) 方法。其中其他的main可以注释掉在打包的时候。

采用jdk1.4编译 maven打包之后上传到Oracle机器上去。

使用命令:

loadjava -r -f -verbose -resolve -user dbUserName/'dbPassWord'  my-one-oracle-0.0.1-SNAPSHOT-jar-with-dependencies.jar 

导入成功之后

creating : resource META-INF/MANIFEST.MF
loading  : resource META-INF/MANIFEST.MF
creating : class com/eastcom/one/oracle/Pair
loading  : class com/eastcom/one/oracle/Pair
creating : class com/eastcom/one/oracle/TransformUtils
loading  : class com/eastcom/one/oracle/TransformUtils
creating : resource META-INF/maven/my-one-oracle/my-one-oracle/pom.properties
loading  : resource META-INF/maven/my-one-oracle/my-one-oracle/pom.properties
creating : resource META-INF/maven/my-one-oracle/my-one-oracle/pom.xml
loading  : resource META-INF/maven/my-one-oracle/my-one-oracle/pom.xml
skipping : resource META-INF/MANIFEST.MF
resolving: class com/eastcom/one/oracle/Pair
resolving: class com/eastcom/one/oracle/TransformUtils
skipping : resource META-INF/maven/my-one-oracle/my-one-oracle/pom.properties
skipping : resource META-INF/maven/my-one-oracle/my-one-oracle/pom.xml
Classes Loaded: 2
Resources Loaded: 3
Sources Loaded: 0
Published Interfaces: 0
Classes generated: 0
Classes skipped: 0
Synonyms Created: 0
Errors: 0

之后可以在plsql中参数导入情况

select * from user_java_classes;

显示结果:


如果需要drop掉,可以通过命令

dropjava  -r -f -verbose -resolve -user dbUserName/'dbPassWord'  my-one-oracle-0.0.1-SNAPSHOT-jar-with-dependencies.jar 

再次查询 user_java_classes 的时候,已经不存在了。

回归正题,把jar包导入到Oracle之后,之后创建函数。

create or replace function getLatAndLngValue(ins_1  varchar2,ins_2  varchar2)  return varchar2  as 
LANGUAGE JAVA NAME  'com/eastcom/one/oracle/TransformUtils.getLatAndLngValue(java.lang.String,java.lang.String) return java.lang.String'; 


如果drop掉函数,可以使用

drop function  getLatAndLngValue ;


函数创建好之后,接下来可以使用自定义函数了

select getLatAndLngValue(t.contourcoordinates,'json') from ipmsdw.O_CO_BA_COMMUNITY_ZZ_D t

select getLatAndLngValue(t.contourcoordinates,'max_lat') from ipmsdw.O_CO_BA_COMMUNITY_ZZ_D t

select getLatAndLngValue(t.contourcoordinates,'min_lat') from ipmsdw.O_CO_BA_COMMUNITY_ZZ_D t

select getLatAndLngValue(t.contourcoordinates,'max_lng') from ipmsdw.O_CO_BA_COMMUNITY_ZZ_D t

select getLatAndLngValue(t.contourcoordinates,'min_lng') from ipmsdw.O_CO_BA_COMMUNITY_ZZ_D t

实现了效果。 OK


参考链接:http://www.cnblogs.com/xinxin1994/p/5990170.html

参考链接:http://blog.csdn.net/z654893465/article/details/73472974

参考链接:http://www.jianshu.com/p/4280ac298ded

参考链接:http://blog.sina.com.cn/s/blog_613126600100rmim.html

参考链接:http://www.cnblogs.com/mellowsmile/p/4602481.html





  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值