Oracle解析JSON字符串
假設某個字段存儲的JSON字符串,我們不想查出來后通過一些常見的編程語言處理(
JSON.parse()
或者是JSONObject.parseObject()
等),想直接在數(shù)據庫上處理,又該如何書寫呢?
其實在ORACLE
中也支持多種機制去處理JSON數(shù)據,例如有操作函數(shù)JSON_ARRAY、JSON_EXISTS、JSON_VALUES、JSON_TABLE、JSON_QUERY等可以像MongoDB
一樣操作JSON數(shù)據。
但是一般開發(fā)中很少使用JSON操作函數(shù),都是像其他語言一樣直接解析成JSON對象或數(shù)組靈活操作數(shù)據,例如:
DECLARE
-- 申明一個json字符串
V_STR NVARCHAR2(1000) := '[
{ "name": "alex", "age": 15, "high": 10, "phone": 1358226000000 },
{ "name": "jan", "age": 16, "high": 92, "phone": 1358226000000 },
{ "name": "jan", "age": 17, "high": 45, "phone": 1358226000000 },
{ "name": "alex", "age": 18, "high": 87, "phone": 1358226000000 },
{ "name": "jan", "age": 15, "high": 10, "phone": 1358226060000 },
{ "name": "alex", "age": 16, "high": 87, "phone": 1358226060000 },
{ "name": "alex", "age": 17, "high": 45, "phone": 1358226060000 },
{ "name": "jan", "age": 18, "high": 92, "phone": 1358226060000 }]';
-- 申明一個json數(shù)組變量(相當于const v_array = [])
V_ARRAY JSON_ARRAY_T;
-- 申明一個json對象變量(相當于const v_object = {})
V_OBJECT JSON_OBJECT_T;
-- 用于接收json key集合(相當于const keyList = Object.keys())
V_KEY_LIST JSON_KEY_LIST;
-- 記住這幾個關鍵字就行了,實際開發(fā)中已經夠用了
BEGIN
-- V_ARRAY := JSON_ARRAY_T(V_STR); -- 解析成json數(shù)組(這樣書寫也可以)
-- 解析成json數(shù)組
V_ARRAY := JSON_ARRAY_T.PARSE(V_STR);
-- 遍歷json數(shù)組
FOR I IN 0 .. V_ARRAY.GET_SIZE - 1 LOOP
-- 解析成json對象
-- V_OBJECT := JSON_OBJECT_T.PARSE('{"A":1}'); 如果是字符串可以直接使用parse()
V_OBJECT := JSON_OBJECT_T(V_ARRAY.GET(I));
-- 獲取 phone 屬性值
DBMS_OUTPUT.PUT_LINE('phone' || ' = ' || V_OBJECT.GET_STRING('phone'));
-- 新增 password 屬性
V_OBJECT.PUT('password', '1');
DBMS_OUTPUT.PUT_LINE('password' || ' = ' || V_OBJECT.GET_STRING('password'));
-- 刪除 high 屬性
V_OBJECT.REMOVE('high');
DBMS_OUTPUT.PUT_LINE('high' || ' = ' || V_OBJECT.GET_STRING('high'));
-- 獲取json對象的 key_list
V_KEY_LIST := V_OBJECT.GET_KEYS;
-- 變量 key_list
FOR KEY_INDEX IN 1 .. V_KEY_LIST.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(V_KEY_LIST(KEY_INDEX)); -- 輸出 key
END LOOP;
END LOOP;
END;
JSON_OBJECT_T
GET開頭的API
JSON_ARRAY_T
GET開頭的API
當然兩種類型的API遠不止如此,用到的時候查閱一下即可。文章來源:http://www.zghlxwxcb.cn/news/detail-570649.html
在自定義函數(shù)上的使用示例文章來源地址http://www.zghlxwxcb.cn/news/detail-570649.html
CREATE OR REPLACE FUNCTION YTGZHDB.FUN_GET_TDYT_NAME(TDYT IN NVARCHAR2) RETURN NVARCHAR2
AS
V_NAME NVARCHAR2(100);
V_KEY_LIST JSON_KEY_LIST;
V_JSON JSON_OBJECT_T;
V_TEMP NVARCHAR2(100);
V_DIC_ID VARCHAR2(50) := '402886cb84ae206e0184be15c1590753'; -- 土地用途(后續(xù)變更調整即可)
V_DIC_SQL VARCHAR2(255) := 'SELECT DI.F_NAME FROM YTGZHDB.DC_DIC_ITEM DI WHERE DI.F_VALUE = :1 AND DI.FK_DIC_ID = :2';
BEGIN
V_JSON := JSON_OBJECT_T.PARSE(TDYT);
V_KEY_LIST := V_JSON.GET_KEYS;
FOR I IN 1 .. V_KEY_LIST.COUNT
LOOP
EXECUTE IMMEDIATE V_DIC_SQL INTO V_TEMP USING V_KEY_LIST(I), V_DIC_ID;
V_NAME := CONCAT(V_NAME, CONCAT(V_TEMP, ','));
END LOOP;
RETURN SUBSTR(V_NAME, 1, (LENGTH(V_NAME) - 1));
END FUN_GET_TDYT_NAME;
到了這里,關于Oracle解析JSON字符串的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!