sql(Oracle)讀取json_list數據和多層嵌套的json數據
最近在開發一個管理系統的時候整理出一個多層嵌套的邏輯,並且在嵌套的最里層存在一對多的業務關系:
簡單舉例說明:每一層都有屬於自己的屬性,這樣就簡單構造出一個三層帶json_list的json報文:
create or replace procedure pro_str_json(
o_code out int,
i_str in VARCHAR2
)
is
---------------------------------------------------------------------------
json_varchar2 varchar2(4000);
inJson json;
paramlist json_list;
paramJson json;
oneJson json;
--變量
--第一層
db_marketcode VARCHAR2(8);
db_marketname VARCHAR2(64);
db_address VARCHAR2(64);
db_tel VARCHAR2(11);
--第二層
db_name VARCHAR2(64);
db_fruitcode VARCHAR2(8);
begin
json_varchar2:='{
"marketcode": "1233336",
"marketname": "超市名字",
"address": "地點",
"tel": "12666666601",
"fruitlist": {
"name": "apple",
"fruitcode": "223344",
"applelist": [
{
"applename": "redfdwple ",
"applecode": "113330",
"price": "10"
},
{
"applename": "grefdwpple ",
"applecode": "1144411",
"price": "12"
},
{
"applename": "yellttwple ",
"applecode": "114522",
"price": "8"
}
]
}
}';
inJson := json(json_varchar2);
--獲取第一層json值
db_marketcode:=json_ext.get_string(inJson,'marketcode');
db_marketname:=json_ext.get_string(inJson,'marketname');
db_address:=json_ext.get_string(inJson,'address');
db_tel:=json_ext.get_string(inJson,'tel');
--第二層
db_name:=json_ext.get_string(inJson,'fruitlist.name');
db_fruitcode:=json_ext.get_string(inJson,'fruitlist.fruitcode');
--接下來獲取第三層,使用json_list來存放json列表
paramJson := json();
paramlist := json_list();
oneJson := json();
paramlist :=json_ext.get_json_list(inJson,'fruitlist.applelist');
--使用循環返回每個json部分的值
FOR i in 1..paramlist.count LOOP
oneJson := JSON(paramlist.get(i));
dbms_output.put_line(json_ext.get_string(oneJson,'applename'));
dbms_output.put_line(json_ext.get_string(oneJson,'applecode'));
dbms_output.put_line(json_ext.get_string(oneJson,'price'));
end loop;
exception
when others then
o_code := -1;
end pro_str_json;