Oracle對Java查詢的幾種方式

Oracle11g對Json的處理很不方便,如果json中帶有一些難以匹配的字符,如時間等,就非常麻煩。
但是Oracle支持導入Java函數,用面向對象的方法可以簡化Json的查詢使用過程。

一、使用Java類(外部依賴包Org.Json或者FastJson或者Gson)

“Org.Json”

1、導入java包(從此處爲org.Json的示例,Org.Json下載地址爲:http://download.csdn.net/download/loveyou388i/10013186本人自己上傳的,可以在百度其他地方找到)
用java寫好處理json的函數之後,測試後存在oracle中。
在cmd中進行操作

--向數據庫導入json相關jar包
loadjava -r   -f  -u  user/password@xxx.xxx.xxx.xxx:1521/orcl json.jar

--刪除指定jar
#dropjava -u user/[email protected]:1521/orcl json.jar

導入成功後是沒有明顯提示的,至少會退出那一條命令,大約幾秒鐘就可以了

2、登錄所要操作的數據庫中,創建具體的java包和函數
可以用sqlPlus 或者 plSQL、Navicat等一切可以執行sql的工具。


執行以下sql語句

 create or replace and compile java source named "JsonUtil" as

 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 import java.lang.Integer;

 public class JsonUtil {
   //取json串單個節點值
   public static String getValue(String jsonStr,String nodeName){
     String nodeValue="";
    try {
       if(jsonStr==null||!jsonStr.startsWith("{")||!jsonStr.endsWith("}")){
         nodeValue="";
       }else{
        JSONObject obj =new JSONObject(jsonStr);
         nodeValue = obj.getString(nodeName);
       }
     } catch (JSONException e) {
       nodeValue="";
     }
     return nodeValue;
   }
   }

/

 create or replace package jsonpkg
 as
 function getval(jsonstr varchar2,nodename varchar2) return varchar2;
  end jsonpkg;
/

create or replace package body jsonpkg
 as
function  getval(jsonstr varchar2,nodename varchar2) return varchar2
 as language java name 'JsonUtil.getValue(java.lang.String,java.lang.String) return java.lang.String';
   end jsonpkg;

/

下面就是查詢具體鍵值對中值的sql語句
//jsonpkg.getval(JSON所在列名,'需要查詢的json中的鍵')
select  distinct jsonpkg.getval(t.JSONSTR,'Name') from  TableTest t;

“Gson”

對於Gson 一樣的需要自己寫jar處理函數,以下爲作者原創,轉載請註明出處:http://blog.csdn.net/loveyou388i/article/details/78176431

1、導入需要用到的jar包(Gson.2.8.2.jar可以在Gson官網下載:百度Gson官網)
再cmd中像上面一樣導入這個jar包,如果你用的是Oracle11g且導入出現問題,請參照我的下一篇博文:導入Jar包出錯
http://blog.csdn.net/loveyou388i/article/details/78206524

cmd-> loadjava -f -r -u user/pass@orcl ****.jar

2、導入後在sqlplus中執行以下sql:

create or replace and compile java source named "GsonUtil" as

import com.google.gson.*;

public class GsonUtil {


public static String TryGetJSON(String JSONstr,String sKey)
  {    
    JsonElement resEle = new JsonParser().parse(JSONstr).getAsJsonObject().get(sKey);
        if (resEle == null || resEle == JsonNull.INSTANCE)
            return null;
    String value = resEle.getAsString();
    if(value!=null)
      return value;
    return null;
  }

 public static int GetJSONValue(int bsm,String JSONstr,String sKey,String sValue)
  {    
    JsonElement resEle = new JsonParser().parse(JSONstr).getAsJsonObject().get(sKey);
    JsonNull NullJson = JsonNull.INSTANCE;
        if (resEle == null || resEle == JsonNull.INSTANCE)
      return -1;
    String tValue = resEle.getAsString();
    if(tValue.equals(sValue))
      return bsm;    
    return -1;
  }
}
/

create or replace package gsonpkg
 as
   function getval(jsonstr varchar2,nodename varchar2) return varchar2;
   function getvalue(bsm number,jsonstr varchar2,nodeKey varchar2,nodeValue varchar2) return number;
 end gsonpkg;
/


create or replace package body gsonpkg
 as
    function  getval(jsonstr varchar2,nodename varchar2) return varchar2
      as language java name 'GsonUtil.TryGetJSON(java.lang.String,java.lang.String) return java.lang.String';
    function  getvalue(bsm number,jsonstr varchar2,nodeKey varchar2,nodeValue varchar2) return number
      as language java name 'GsonUtil.GetJSONValue(int,java.lang.String,java.lang.String,java.lang.String) return int';
end gsonpkg;
/

創建完檢查包無誤後,查詢Json的sql語句爲:

select distinct gsonpkg.getVal(t.bqxx,'PC') from t_markssource t;
select * from t_markssource t1 where t1.ID in (select distinct gsonpkg.getvalue(t.id,t.bqxx,'PC','02') from t_markssource t) and t1.ID in(select distinct gsonpkg.getvalue(t.id,t.bqxx,'PC','03') from t_markssource t);

FastJson(貌似有過多的外部依賴jar包),此處不作介紹了。

二、安裝PL/JSON

pljson的好處是容易安裝,函數都已經寫好了,但是學習很難。本人琢磨一下午才弄了一點皮毛來用。

pl/json的下載地址爲https://github.com/pljson/pljson
解壓後 用sqlplus 運行@install.sql,
方法:cmd->輸入:
sqlplus user/password@orcl as sysdba @…/../install.sql

【如果安裝顯示什麼無法找到路徑src/**.typ,我也不知道什麼原因,你可以打開install.sql,將路徑全部改成根目錄下面,然後把對於目錄下的文件移動到根目錄下再執行。】

安裝成功後,可以在package中看到以下幾個包,概念層的東西我就不說了,直接說怎麼用。
這裏寫圖片描述
在查詢語句中,可以如下方法使用:

select distinct json_ext.get_string(json(t.bqxx),'JSR')  from t_markssource t ;

其中,t_markssource是表名,json(t.bqxx)是指將t表的bqxx這一列當成json類,這個用法真是叼叼的,我琢磨了一下午才猜出來,破文檔根本沒有說明,’JSR’是json裏需要找的key,獲得的是json裏的value,前面加distinct可以區分唯一值。

至於其他函數,也是同樣的道理,只是需要在傳入參數處確保參數類型爲json類,或者json_list類,或者json_value類。

需要注意的是,查出來的值有可能是空的,而且大小寫、空格有很嚴格的限制,在實際使用中需要開發者再去精確地檢驗一次。

發佈了71 篇原創文章 · 獲贊 39 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章