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

————————————————
版權聲明:本文為CSDN博主「liuxiangke0210」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/liuxiangke0210/article/details/78326901


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM