1、背景:

由于项目要求,需要对大型的 Json 数据入库到DB中(clob 类型),由于内容过长或者 oracle 版本限制,有一些熟知的处理方法是不能使用的。

精确解决问题,可以直接看第四步:【4、对应的栗子 SQL:】,其他都是废话。

2、结构:

原始数据:

'{"name": "李四", "skillLevel":{"项目经理": "高级","技术经理": "高级","产品经理": "高级"}}'

3、目标:

3.1、将 “李四” 修改为 “李四大佬” 【修改一级 value】

3.2、将 “项目经理” 的 “高级” 修改为 “超高级” 【修改二级 value】

3.3、删除属性 “技术经理”  【删除 key】

3.4、“产品经理” 不做任何修改 【不动】

3.5、新增属性 “技术总监” ,级别是 “超高级”  【新增 key-value】

效果对照4里面的 SQL 即可,我就不拆开单条 SQL 了。

4、对应的栗子 SQL:

SELECT
JSON_MERGEPATCH(
'{"name": "李四", "skillLevel":{"项目经理": "高级","技术经理": "高级","产品经理": "高级"}}'
, '{"name": "李四大佬", "skillLevel":{"项目经理": "超高级","技术经理": null, "技术总监": "超高级"}}'
RETURNING CLOB PRETTY
) AS text
FROM dual t

5、JSON_MERGEPATCH 函数解释

添加 RETURNING CLOB PRETTY 是因为我的 Json_data 超大(超过了 varchar2),如果不指定返回 clob 类型,它就会无法处理,会返回 NULL。

注意:只有两个入参,第二个入参后面跟的是指定类型

JSON_MERGEPATCH(json_data, update_json_date [RETURNING CLOB PRETTY])

6、实际应用

把 李四 的信息修改

UPDATE T.JSON_DATA =
JSON_MERGEPATCH(
T.JSON_DATA
, '{"name": "李四大佬", "skillLevel":{"项目经理": "超高级","技术经理": null, "技术总监": "超高级"}}'
RETURNING CLOB PRETTY
)
FROM JSON_DATA_TABLE t
WHERE tJSON_EXISTS(t.JSON_DATA, '$.name ? (@ == "李四")');

7、其他函数解释

-- JSON_QUERY 查询对象,如果查询的属性不是对象,则返回 NULL
SELECT JSON_QUERY('{"common": {"sex": { "M": "男", "F": "女", "U": "不詳" }}}', '$.common.sex') as sexLabel FROM DUAL; -- JSON_VALUE 查询字段,如果查询的属性是对象,则返回 NULL
SELECT JSON_VALUE('{"common": {"sex": { "M": "男", "F": "女", "U": "不詳" }}}', '$.common.sex.M') as sexLabel FROM DUAL; -- JSON_EXISTS 判断属性或者值是否存在
SELECT 1 FROM DUAL WHERE JSON_EXISTS('{"common": {"sex": { "M": "男", "F": "女" }}}', '$.common.sex.M');
SELECT 1 FROM DUAL WHERE JSON_EXISTS('{"common": {"sex": { "M": "男", "F": "女" }}}', '$.common.sex.M ? (@ == "男")'); -- JSON_MERGEPATCH 合并两个对象,将第二个参数的存在的属性替换掉第一个 JSON 对象的属性;
SELECT JSON_MERGEPATCH('{"common": {"sex": { "M": "男", "F": "女" }}}', '{"common": {"sex": { "M": "男1", "F": "女" }}}') as sex FROM DUAL; -- 如果 JSON_MERGEPATCH 的返回值超大,则需要指定返回类型:
SELECT JSON_MERGEPATCH(TO_CLOB('{"common": {"sex": { "M": "男", "F": "女" }}}'), '{"common": {"sex": { "M": "男1", "F": "女" }}}' RETURNING CLOB PRETTY ) as sex FROM DUAL; --JSON_TABLE 将 JSON 数据转为表结构显示 JSON_OBJECT 生成一个 JSON 对象 JSON_ARRAY 生成一个 JSON 数组 -- 找不到方法
-- JSON_MERGEPRESERVE 修改数据使用
-- JSON_MODIFY 修改数据使用
-- JSON_KEYS 获取所有的 keys
-- JSON_REMOVE 删除某个 key
												

Oracle 对 Json 数据进行增删改的更多相关文章

  1. Delphi - cxGrid连接Oracle数据库 实现数据的增删改查

    cxGrid连接Oracle数据库 实现数据的增删改查 cxGrid连接Oracle数据库 1:通过OraSession连接数据库.OraDataSet实现OraSession和OraDataSour ...

  2. Oracle.数据的增删改、表操作(创建,修改,删除)、数据类型

    SELECT ename,dname FROM emp,dept WHERE emp.deptno=dept.deptno; SELECT dname,loc FROM dept; SELECT JO ...

  3. vue实现对表格数据的增删改查

    在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改.在vue中,我们更应该专注 ...

  4. Node.js + MySQL 实现数据的增删改查

    通过完成一个 todo 应用展示 Node.js + MySQL 增删改查的功能.这里后台使用 Koa 及其相应的一些中间件作为 server 提供服务. 初始化项目 $ mkdir node-cru ...

  5. vue实现对数据的增删改查(CURD)

    vue实现对数据的增删改查(CURD) 导语: 网上看到一个写的比较好的学习文章,转载分享一下 在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的 ...

  6. vue实现数据的增删改查

    在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改.在vue中,我们更应该专注 ...

  7. python链接oracle数据库以及数据库的增删改查实例

    初次使用python链接oracle,所以想记录下我遇到的问题,便于向我这样初次尝试的朋友能够快速的配置好环境进入开发环节. 1.首先,python链接oracle数据库需要配置好环境. 我的相关环境 ...

  8. 使用 Json.Net 对Json文本进行 增删改查

    JSON 已经成为当前主流交互格式, 如何在C#中使用 Json.Net 对Json文本进行 增删改查呢?见如下代码 #region Create (从零创建) public static strin ...

  9. Mybatis框架基于注解的方式,实对数据现增删改查

    编写Mybatis代码,与spring不一样,不需要导入插件,只需导入架包即可: 在lib下 导入mybatis架包:mybatis-3.1.1.jarmysql驱动架包:mysql-connecto ...

  10. dbutils中实现数据的增删改查的方法,反射常用的方法,绝对路径的写法(杂记)

    jsp的三个指令为:page,include,taglib... 建立一个jsp文件,建立起绝对路径,使用时,其他jsp文件导入即可 导入方法:<%@ include file="/c ...

随机推荐

  1. Python+Selenium自动搜索基金业协会指定企业名单,爬虫抓取指定信息并保存到数据库

    Python+Selenium自动搜索基金业协会指定企业名单,抓取指定信息并保存到数据库.网址https://gs.amac.org.cn/amac-infodisc/res/pof/manager/ ...

  2. 这可能是国内Qt/C++界最受欢迎开源项目之一/5.8Kstar/持续迭代更新

    一.前言 本项目大概在2020年开始的,大概在2022年重写了一遍,主要是分门别类存放.本项目主要是QWidget编写的一些开源的demo,支持Qt4.Qt5.Qt6,支持任意系统,预计会有100多个 ...

  3. Qt/C++编写手机版本视频播放器和Onvif工具(可云台和录像)

    一.前言 用Qt+ffmpeg写播放器很多人有疑问,为何不用Qt自己的多媒体框架来写,最重要的原因是Qt自带的目前都依赖具体的本地解码器,如果解码器不支持,那就是歇菜的,最多支持个MP4格式,而且在手 ...

  4. FFmpeg命令行选项

    如下内容取自官网文档"Documentation-ffmpeg"和"Documentation-ffmpeg-all" 1 帮助信息 如下选项适用于 ff 系列 ...

  5. VS2010/MFC 获取当前程序路径的方法

    第一种方法 DWORD GetCurrentDirectory( DWORD nBufferLength, // size, in characters, of directory buffer LP ...

  6. 2020年了,Android后台保活还有戏吗?看我如何优雅的实现!

    1.引言 对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了. 自从Android P(即Android 8.0)出现以后,Android已经从系统层面将后台保活 ...

  7. Android增加USB Camera摄像头驱动支持

    一般情况下kernel需要添加以下宏 ================================= CONFIG_VIDEO_DEV=yCONFIG_VIDEOBUF2_CORE=yCONFIG ...

  8. c# set Webbowser version with WPF/Winform app

    <Window x:Class="TestWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/200 ...

  9. Golang-反射10

    http://c.biancheng.net/golang/reflect/ Go语言反射(reflection)简述 反射(reflection)是在 Java 出现后迅速流行起来的一种概念,通过反 ...

  10. mysql异常处理的收集

    今天在处理mysql的存储过程,判断游标是否到了结尾,结果让返回零行的一个查询触发了,随即从网上查阅资料收集异常异常处理. MySql错误处理(一)- SQL服务器模式 导言:MySql错误处理的基础 ...