遇到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
————————————————
版权声明:本文为CSDN博主「liuxiangke0210」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liuxiangke0210/article/details/78326901