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. 聊一聊 C#线程池 的线程动态注入 (中)

    一:背景 1. 讲故事 上一篇我们用 Thread.Sleep 的方式演示了线程池饥饿场景下的动态线程注入,可以观察到大概 1s 产生 1~2 个新线程,很显然这样的增长速度扛不住上游请求对线程池的D ...

  2. 管理员应了解的 SIEM解决方案七大功能 !

    ​SIEM解决方案已成为企业网络安全武器库中不可或缺的一部分.但由于SIEM功能过于复杂且架构难以理解,企业往往SIEM的潜在功能.遗憾的是,他们忽视的潜在功能正是解开企业网络合规的重要部分. 例如, ...

  3. IPV6禁用导致 RabbitMQ 无法启动的问题

    问题现象 在开发的过程中遇到了 RabbitMQ 怎么也启动不起来的现象.查看 RabbitMQ 自身的启动日志,并没有发现有什么有用的报错信息,只是从某天开始就一直在打印重启的日志,尝试多次重启也不 ...

  4. Qt音视频开发44-本地摄像头推流(支持分辨率/帧率等设置/实时性极高)

    一.前言 本地摄像头推流和本地桌面推流类似,无非就是采集的设备源头换成了本地摄像头设备而不是桌面,其他代码完全一样.采集本地摄像头实时视频要注意的是如果设置分辨率和帧率,一定要是设备本身就支持的,如果 ...

  5. Qt编写物联网管理平台34-地图按钮

    一.前言 地图按钮很常见,这也是用户给钱就干的一个模块.设备现场提供了对应的地图文件,其实就是图片文件,做的简单点就是直接CAD图纸转成jpg,做的精致点就是搞了3D风格的立体样式图片,其实还是图片, ...

  6. 虚拟化基础vSphere

  7. 3. 使用sql查询csv/json文件内容,还能关联查询?

    1. 简介 我们在前面的文章提到了calcite可以支持文件系统的数据源适配, 其实官方已经提供了相应的能力, 其支持csv和json的查询适配, 废话不多说, 直接展示. 2. Maven < ...

  8. BUUCTF刷题-Web方向1~5wp

    [极客大挑战 2019]EasySQL 一个sql注入登录框,直接万能密码登录 拿到flag [极客大挑战 2019]Havefun 打开环境,没有任何信息,查看源码,发现这么一段代码 GET方式传入 ...

  9. Presto常用命令

    一.基本资料 1.官方文档 https://prestodb.github.io/docs/current/sql/select.html 二.常用命令 1.kill任务,登录presto客户端 CA ...

  10. FLink17--全窗口聚合方法1--ApplyWindowApp

    一.依赖 二.代码 package net.xdclass.class11; import java.util.List; import java.util.stream.Collectors; im ...