sql(Oracle)读取json_list数据和多层嵌套的json数据
2017-07-06 14:49
661 查看
最近在开发一个管理系统的时候整理出一个多层嵌套的逻辑,并且在嵌套的最里层存在一对多的业务关系:
简单举例说明:一家水果店出售多种水果(为了简化业务结构,就单纯一苹果为主线),苹果又分为多种类型(比如红苹果、青苹果、黄苹果),所以得到三层结构,每一层都有属于自己的属性,这样就简单构造出一个三层带json_list的json报文:
{
"marketcode": "123456",
"marketname": "好吃的水果店",
"address": "一个好地方",
"tel": "12345678901",
"fruitlist": {
"name": "apple",
"fruitcode": "223344",
"applelist": [
{
"applename": "redapple ",
"applecode": "111000",
"price": "10"
},
{
"applename": "greenapple ",
"applecode": "111111",
"price": "12"
},
{
"applename": "yellowapple ",
"applecode": "111222",
"price": "8"
}
]
}
}接下来就是详细的解析代码:
declare
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": "123456",
"marketname": "好吃的水果店",
"address": "一个好地方",
"tel": "12345678901",
"fruitlist": {
"name": "apple",
"fruitcode": "223344",
"applelist": [
{
"applename": "redapple ",
"applecode": "111000",
"price": "10"
},
{
"applename": "greenapple ",
"applecode": "111111",
"price": "12"
},
{
"applename": "yellowapple ",
"applecode": "111222",
"price": "8"
}
]
}
}';
inJson := json(json_varchar2);
--获取第一层json值
db_marketcode=json_get_string(inJson,'marketcode');
db_marketname=json_get_string(inJson,'marketname');
db_address=json_get_string(inJson,'address');
db_tel=json_get_string(inJson,'tel');
--第二层
db_name:=json_get_string_ext(inJson,'fruitlist.name');
db_fruitcode:=json_get_string_ext(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_get_string(oneJson,'applename'));
dbms_output.put_line(json_get_string(oneJson,'applecode'));
dbms_output.put_line(json_get_string(oneJson,'price'));
end loop;
end;总结:以上解析过程,第一第二层因为直接获取值并赋值给数据库变量,在存储过程中可以多次使用,但是对于第三层的数据,如果需要将数据插入到表中就需要将插入语句放在循环中处理,因为循环的关系,第三层的数据在当前过程中不适合作为变量被其他地方使用;
以上内容由作者本人亲测并整理出来分享给大家,如果中间存在错误或者误导部分,望读者帮忙指正,如果有更好的处理同类型问题的方法,欢迎共同交流!
简单举例说明:一家水果店出售多种水果(为了简化业务结构,就单纯一苹果为主线),苹果又分为多种类型(比如红苹果、青苹果、黄苹果),所以得到三层结构,每一层都有属于自己的属性,这样就简单构造出一个三层带json_list的json报文:
{
"marketcode": "123456",
"marketname": "好吃的水果店",
"address": "一个好地方",
"tel": "12345678901",
"fruitlist": {
"name": "apple",
"fruitcode": "223344",
"applelist": [
{
"applename": "redapple ",
"applecode": "111000",
"price": "10"
},
{
"applename": "greenapple ",
"applecode": "111111",
"price": "12"
},
{
"applename": "yellowapple ",
"applecode": "111222",
"price": "8"
}
]
}
}接下来就是详细的解析代码:
declare
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": "123456",
"marketname": "好吃的水果店",
"address": "一个好地方",
"tel": "12345678901",
"fruitlist": {
"name": "apple",
"fruitcode": "223344",
"applelist": [
{
"applename": "redapple ",
"applecode": "111000",
"price": "10"
},
{
"applename": "greenapple ",
"applecode": "111111",
"price": "12"
},
{
"applename": "yellowapple ",
"applecode": "111222",
"price": "8"
}
]
}
}';
inJson := json(json_varchar2);
--获取第一层json值
db_marketcode=json_get_string(inJson,'marketcode');
db_marketname=json_get_string(inJson,'marketname');
db_address=json_get_string(inJson,'address');
db_tel=json_get_string(inJson,'tel');
--第二层
db_name:=json_get_string_ext(inJson,'fruitlist.name');
db_fruitcode:=json_get_string_ext(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_get_string(oneJson,'applename'));
dbms_output.put_line(json_get_string(oneJson,'applecode'));
dbms_output.put_line(json_get_string(oneJson,'price'));
end loop;
end;总结:以上解析过程,第一第二层因为直接获取值并赋值给数据库变量,在存储过程中可以多次使用,但是对于第三层的数据,如果需要将数据插入到表中就需要将插入语句放在循环中处理,因为循环的关系,第三层的数据在当前过程中不适合作为变量被其他地方使用;
以上内容由作者本人亲测并整理出来分享给大家,如果中间存在错误或者误导部分,望读者帮忙指正,如果有更好的处理同类型问题的方法,欢迎共同交流!
相关文章推荐
- Oracle java.sql.SQLException: 无法从套接字读取更多的数据
- 从数据库读取数据存放在List<T>中,在jsp中将其取出来。(使用JSON)
- 利用Gson解析多层嵌套的JSON数据
- 提取多层嵌套JSON类型数据
- 关于solr建立json 多层嵌套复杂数据的第一种方法
- ASP.NET提取多层嵌套json数据的方法
- SQL 数据的导入导出,对远程(MSsql,OracleAccess,)数据库的操作以及读取Excel,txt文件中的数据
- 提取多层嵌套Json数据
- asp.net提取多层嵌套json数据的方法
- Newtonsoft.Json读取txt文件中json数据并存到SQL service 数据库!
- Oracle ORA-3137[12333] 关闭的连接 java.sql.SQLRecoverableException: 无法从套接字读取更多的数据 _optim_peek_user_binds
- 一个关于Json数据List和对象嵌套反序列化的工具类,java(20151130)
- spark sql udf 解析json数据表的嵌套数组
- 提取多层嵌套Json数据
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- 提取多层嵌套Json数据
- unity使用SimpleJSON读取json数据转存程VO存入list内
- oracle12c JSON数据 使用SQL语句实现多表左外连接 显示无效数据 分页查询
- 详解ASP.NET提取多层嵌套json数据的方法
- Spark SQL 读取json 里面的数据 ,jason 是 结构的数据