Oracle11g处理JSON数据函数

通过自定义oracle函数来实现读取表中json类型数据

在开发系统调用第三方接口来实现本地特色功能时,对接口调用数据没有设计表保存业务数据,而是采用统一保存调用日志的方法,在后台用AOP截取这个业务所有接口请求,获固定参数做请求标记,然后数据库中保存所有接口调用请求和响应信息,调用和响应参数都是以json数据格式存储。这样做业务确实很方便,但是客户要统计一些业务详细的数据,处理起来很尴尬。
由于开发时把所有这类业务请求调用报文转换为json存储到数据库,没有详细表存储,一个大类业务调用多个接口都存到一张表中。在网上看了一些处理oracle json文件的方法,可以直接用oracl 自带的函数处理,但这是oracle 11g 的版本不支持JSON处理函数,需要oracle 12 及以上版本才能支持。看了一下这块可以通过Oracle自定义函数来处理,实际查询时调用这个函数根据json的key获取具体的vale值,这样就能获取到json 个数数据中想要的数据了。

通过自定义oracle函数来实现读取表中json类型数据,

Oracle数据库存储JSON字段

在这里插入图片描述

ORACLE 处理JSON格式字段函数模板

CREATE OR REPLACE FUNCTION F_GET_FRO_JSON(
KREC_ID VARCHAR2,    --唯一主键值
JSON VARCHAR2        --想要获取的key
) RETURN VARCHAR2 IS
JSON_VALUE VARCHAR(60); -- 根据自己JSON数据中值长度设置
JSON_INS INTEGER;
M_INS INTEGER;
D_INS INTEGER;
BEGIN

--获取json key位置
select instr(TO_CHAR("目标字段"),JSON) INTO JSON_INS from "目标表" T
WHERE "主键"=KREC_ID;

--获取json后第一个冒号
select instr(TO_CHAR("目标字段"),':',JSON_INS) INTO M_INS from "目标表" T
WHERE "主键"=KREC_ID;

--获取json后第一个逗号
select instr(TO_CHAR("目标字段"),',',JSON_INS) INTO D_INS from "目标表" T
WHERE "主键"=KREC_ID;

--最后一位json无逗号,直接取长度
if JSON_INS<>0 AND D_INS =0 then
select length(TO_CHAR("目标字段")) INTO D_INS from "目标表" T
WHERE "主键"=KREC_ID;
end if;

--截取,字符串类型去除引号
select replace(SUBSTR(TO_CHAR("目标字段"),M_INS+1,D_INS-M_INS-1),'"','') INTO JSON_VALUE from "目标表" T
WHERE "主键"=KREC_ID;

RETURN JSON_VALUE;

END;

实际应用

创建一个测用的试表


-- 创建JSON 表
create table ORACLE_JSON_TEST
(
  ID   NUMBER,
  JSON VARCHAR2(4000)
)

插入JSON数据


-- 插入JSION数据
insert into ORACLE_JSON_TEST (ID, JSON)
values (1, '{"STU_ID":"2301001","STU_NAME":"张三","STU_AGE":"24","STU_MAJOR":"计算机科学与技术","班级":"190034"}');

insert into ORACLE_JSON_TEST (ID, JSON)
values (2, '{"STU_ID":"2301002","STU_NAME":"张四","STU_AGE":"25,"STU_MAJOR":"计算机科学与技术","班级":"190034"}');

insert into ORACLE_JSON_TEST (ID, JSON)
values (3, '{"STU_ID":"2301003","STU_NAME":"李四","STU_AGE":"25,"STU_MAJOR":"计算机科学与技术","班级":"190034"}');

insert into ORACLE_JSON_TEST (ID, JSON)
values (4, '{"STU_ID":"2301003","STU_NAME":"李三","STU_AGE":"25,"STU_MAJOR":"计算机科学与技术","班级":"190034"}');

insert into ORACLE_JSON_TEST (ID, JSON)
values (5, '{"STU_ID":"2301003","STU_NAME":"李二","STU_AGE":"25,"STU_MAJOR":"计算机科学与技术","班级":"190034"}');

### 查询测试数据
select * from ORACLE_JSON_TEST;

在这里插入图片描述

根据JSON函数模板修改对应表处理函数


CREATE OR REPLACE FUNCTION ORACLE_JSON_GET(
KREC_ID VARCHAR2,
KJSON VARCHAR2

) RETURN VARCHAR2 IS
JSON_VALUE VARCHAR(30);
JSON_INS  INTEGER;
M_INS INTEGER;
D_INS INTEGER;
BEGIN

--获取json key位置
select instr(TO_CHAR(T.JSON),KJSON) INTO JSON_INS  from ORACLE_JSON_TEST T  --获取 json 的表
WHERE T.ID=KREC_ID;

--获取json后第一个冒号
select instr(TO_CHAR(T.JSON),':',JSON_INS) INTO M_INS  from ORACLE_JSON_TEST T
WHERE T.ID=KREC_ID;

--获取json后第一个逗号
select instr(TO_CHAR(T.JSON),',',JSON_INS) INTO D_INS  from ORACLE_JSON_TEST T
WHERE T.ID=KREC_ID;

--最后一位json无逗号,直接取长度
if JSON_INS<>0 AND D_INS =0 then
select length(TO_CHAR(T.JSON)) INTO D_INS  from ORACLE_JSON_TEST T
WHERE T.ID=KREC_ID;
end if;

--截取,字符串类型去除引号
select replace(SUBSTR(TO_CHAR(T.JSON),M_INS+1,D_INS-M_INS-1),'"','') INTO JSON_VALUE  from ORACLE_JSON_TEST T
WHERE T.ID=KREC_ID;

RETURN JSON_VALUE;

END;

用自定义函数查询,拆分JSON字符

用自定义函数查询,拆分JSON字符获取想要的JSON字符信息。


SELECT T.ID,
T.JSON,
ORACLE_JSON_GET(T.ID,'STU_ID') AS STU_ID,
ORACLE_JSON_GET(T.ID,'STU_NAME') AS STU_NAME ,
ORACLE_JSON_GET(T.ID,'STU_AGE') AS STU_AGE,
ORACLE_JSON_GET(T.ID,'STU_MAJOR') AS STU_MAJOR  
FROM ORACLE_JSON_TEST T

查询结果
在这里插入图片描述
https://cloud.tencent.com/developer/article/1934951

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle 11g并不直接支持JSON解析功能,但可以通过使用PL/JSON库实现JSON解析。 PL/JSON是一个PL/SQL库,它提供了解析和生成JSON数据的功能。要使用PL/JSON,需要下载并安装它。你可以从以下链接下载PL/JSON库: https://github.com/pljson/pljson 安装后,可以使用以下方法解析JSON数据: 1. 使用JSON_OBJECT_T类型创建JSON对象 可以使用JSON_OBJECT_T类型创建一个JSON对象,并使用put方法向其中添加键值对。例如: ```sql DECLARE my_json JSON_OBJECT_T := JSON_OBJECT_T(); BEGIN my_json.put('name', 'John'); my_json.put('age', 30); my_json.put('isMarried', false); END; ``` 2. 使用JSON_ARRAY_T类型创建JSON数组 可以使用JSON_ARRAY_T类型创建一个JSON数组,并使用append方法向其中添加值。例如: ```sql DECLARE my_array JSON_ARRAY_T := JSON_ARRAY_T(); BEGIN my_array.append('apple'); my_array.append('banana'); my_array.append('orange'); END; ``` 3. 使用JSON_OBJECT_T和JSON_ARRAY_T类型解析JSON数据 可以使用JSON_OBJECT_T和JSON_ARRAY_T类型解析JSON数据。例如: ```sql DECLARE my_json JSON_OBJECT_T := JSON_OBJECT_T.parse('{"name":"John","age":30,"isMarried":false}'); my_array JSON_ARRAY_T := JSON_ARRAY_T.parse('[1, 2, 3]'); name_val VARCHAR2(100); age_val NUMBER; is_married_val BOOLEAN; array_val JSON_ARRAY_T; BEGIN name_val := my_json.get_string('name'); age_val := my_json.get_number('age'); is_married_val := my_json.get_boolean('isMarried'); array_val := my_array; END; ``` 4. 使用JSON_QUERY函数查询JSON数据 可以使用JSON_QUERY函数查询JSON数据。例如: ```sql SELECT JSON_QUERY('{"name":"John","age":30,"isMarried":false}', '$.name') AS name_val, JSON_QUERY('[1, 2, 3]', '$[1]') AS array_val FROM DUAL; ``` 以上是一些简单的示例。有关更多详细信息,请参阅PL/JSON库的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值