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