Oracle 21c对JSON支持功能增强
在这篇文章中《Oracle和JSON的结合》介绍了Oracle对JSON的支持,有朋友提了两个问题,
问题1,Oracle有没有字段可以直接存储JSON串并支持检索的?
问题2,试过几次,用来读取和约束还行,但是要用来存并还需要修改,还是不太容易。联想到DB2之前的XmlQuery语法,门槛太高,不小心就出错
(1) 针对问题1
时代在进步,技术同样在发展,Oracle 21c(准确地说,某些功能从20c就已经引入了,由于20c只是预览版,还是主要以21c为准)引入了JSON数据类型,目的就是为了提升检索和DML操作对JSON数据的效率,
https://docs.oracle.com/en/database/oracle/oracle-database/21/nfcon/application-development.html#GUID-47BBA332-62C9-41AD-A1D2-51EE02379171
如下所示,
SQL> create table tjson(id number, json_data json);
Table created.
可以按照常规的字符串类型插入,
SQL> insert into tjson values(1, '{"name":"Cristiano Ronaldo","goal":30}');
1 row created.
还可以使用JSON构造函数插入,
SQL> insert into tjson values(2, json('{"name":"Leo Messi","goal":25}'));
1 row created.
可以直接检索,
SQL> select * from tjson;ID JSON_DATA
---------- -------------------------------------------------------1 {"name":"Cristiano Ronaldo","goal":30}2 {"name":"Leo Messi","goal":25}
还可以使用写程序时常用的"."操作符进行检索,
SQL> select j.json_data.name from tjson j;
NAME
--------------------------------------------------------------------------------
"Cristiano Ronaldo"
"Leo Messi"
json_value函数能用特定类型返回节点数据,
SQL> select j.id, json_value(j.json_data, '$.name') as name,2 json_value(j.json_data, '$.goal' returning number) as goal3 from tjson j;ID NAME GOAL
---------- ---------------------- ----------1 Cristiano Ronaldo 302 Leo Messi 25
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/JSON_VALUE.html#GUID-C7F19D36-1E75-4CB2-AE67-ADFBAD23CBC2
json_query函数可以完成相同的操作,
SQL> select j.id, json_query(j.json_data, '$.name' returning varchar2) as name,2 json_query(j.json_data, '$.goal' returning varchar2) as goal3 from tjson j;ID NAME GOAL
---------- -------------------------- ---------------1 "Cristiano Ronaldo" 302 "Leo Messi" 25
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/JSON_QUERY.html#GUID-6D396EC4-D2AA-43D2-8F5D-08D646A4A2D9
还可以使用json_table函数,
SQL> select j.id, jt.name, jt.goal2 from tjson j,3 json_table(j.json_data, '$' columns(name varchar2(50 char) path '$.name',4 goal number path '$.goal')) jt;ID NAME GOAL
---------- -------------------------------------------------- ----------1 Cristiano Ronaldo 302 Leo Messi 25
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/JSON_TABLE.html#GUID-3C8E63B5-0B94-4E86-A2D3-3D4831B67C62
(2) 针对问题2
21c引入了json_transform函数,他的作用就是可以通过指定一个或多个操作符改JSON数据或者片段,
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/JSON_TRANSFORM.html#GUID-DD2A821B-C688-4310-81B5-5F45090B9366
如下所示,修改id=1的记录中goal这个节点的值,
SQL> update tjson set json_data = json_transform(json_data, set '$.goal' = 35) where id = 1;
1 row updated.
检索进行验证,
SQL> select j.id, json_value(j.json_data, '$.name') as name,2 json_value(j.json_data, '$.goal' returning number) as goal3 from tjson j;ID NAME GOAL
---------- -------------------------------------------------- ----------1 Cristiano Ronaldo 352 Leo Messi 25
还支持同时进行多种变更操作,
SQL> update tjson set json_data = json_transform(json_data, set '$.name' = 'L.Messi', replace '$.goal' = 30 returning json) where id = 2;
1 row updated.
支持这些操作,
removeOp | insertOp | replaceOp | appendOp | setOp | renameOp | keepOp
可以看到更新,
SQL> select j.id, json_value(j.json_data, '$.name') as name,2 json_value(j.json_data, '$.goal' returning number) as goal3 from tjson j;ID NAME GOAL
---------- -------------------------- ----------1 Cristiano Ronaldo 352 L.Messi 30
至少从肉眼观测效率上和普通数据类型的增删改相差无几,如果比较关注,可以进行一些实际的压测。虽然语法略复杂,但至少从操作层面上,还是比较简洁的,对于JSON数据的处理,不再只能通过程序来做了,数据库提供了另外一种方案,尤其是使用存储过程,PL/SQL中同样能用到这些函数和数据类型,会更加便捷。
参考资料,
https://www.modb.pro/db/110452
https://blog.csdn.net/horses/article/details/120369571
https://docs.oracle.com/en/database/oracle/oracle-database/21/nfcon/application-development.html#GUID-47BBA332-62C9-41AD-A1D2-51EE02379171
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/JSON_VALUE.html#GUID-C7F19D36-1E75-4CB2-AE67-ADFBAD23CBC2
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/JSON_QUERY.html#GUID-6D396EC4-D2AA-43D2-8F5D-08D646A4A2D9
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/JSON_TABLE.html#GUID-3C8E63B5-0B94-4E86-A2D3-3D4831B67C62
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/JSON_TRANSFORM.html#GUID-DD2A821B-C688-4310-81B5-5F45090B9366
如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发pyq,
近期更新的文章:
《翻译专业资格(水平)考试介绍》
《MySQL忘了账号密码,除了跑路,还能补救么?》
《非标准数据块的表空间使用》
《数据库安全的重要性》
《CentOS 7.9安装Oracle 21c历险记》
近期的热文:
《"红警"游戏开源代码带给我们的震撼》
文章分类和索引:
《公众号1000篇文章分类和索引》
Oracle 21c对JSON支持功能增强相关推荐
- SQL Server 2016中的本机JSON支持
With the introduction of SQL Server 2016, Microsoft introduced many new features which had taken SQL ...
- Oracle 21C 新特性:数据泵相关新特性汇总
墨墨导读:本文来自墨天轮用户"JiekeXu"投稿,墨天轮主页:https://www.modb.pro/u/434,本文分享Oracle 21c 新特性:数据泵相关新特性汇总. ...
- json oracle 导入,JsonToOracle(Json导入Oracle工具)
JsonToOracle(Json导入Oracle工具) JsonToOracle(Json导入Oracle工具)软件简介:JsonToOracle(Json导入Oracle工具)是一款够用以将Jso ...
- 集成开发环境PL/SQL Developer v13.0新功能(二)——PL / SQL美化功能增强
Allround Automations是一家位于荷兰的私人控股公司.该公司成立于1989年,在Oracle开发工具方面是全球领先的服务提供商.其中,产品PL/SQL Developer是一个集成开发 ...
- datagrid底部显示水平滚动_DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强
行业领先的.NET界面控件DevExpress 日前正式发布v19.1版本,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WPF v19.1中新增的一些控件及部 ...
- PostgreSQL 10.0 preview 功能增强 - 后台运行(pg_background)
标签 PostgreSQL , 10.0 , 后台运行 , pg_background_launch , pg_background_result , pg_background_detach , p ...
- Elixir 1.2带来多项功能增强和性能提升
José Valim宣布了Elixir这门动态.函数式编程语言的1.2版本. \\ Valim是Elixir的创建者.他表示,1.2版本"带来了功能增强.Bug修复.性能提升等等" ...
- oracle hyperion招聘,Hyperion Planning功能顾问
岗位职责: 1. 负责预算系统优化业务需求调研分析.方案设计和文档编写: 2. 参与预算系统优化实施工作,及时反馈外部资源的实施情况,负责实施质量的把控: 3. 参与预算系统的日常运维工作,能够解决用 ...
- VB.NET完成一个功能增强的记事本
VB.NET完成一个功能增强的记事本 分类: DotNet 2011-07-02 16:05 153人阅读 评论(0)收藏 举报 想必大家都听说过Notepad2,Notepad++一类的记事本增强软 ...
最新文章
- 详解Jedis连接池报错处理
- 山东省各2021高考成绩查询,关于2021年山东省高考成绩查询系统入口【官网】
- rqnoj 496 [IOI1999]花店橱窗布置 (简单dp)
- python之turtle库(画图)
- 多行字符串的表示方式
- 信息学奥赛一本通(1257:Knight Moves)
- ajax控件扩展,22.6 扩展控件
- 乳化液稳定剂php,乳化液稳定剂PHP对小于0.1mm煤泥浮选的影响
- Java生成验证码合集(一)简单版
- vue 非父子组件传值
- linux输入中文老是有字母,Fcitx 中文输入法中世界语字母的输入方法
- Words Reciting 2016.5.4
- 在laravel中使用wordpress
- 51单片机数码管显示数字及小数点
- 微信小程序uniapp高德开放平台路线规划1对多导航路线方法记录
- 处理各种压力(情绪、家庭)时,需要注意什么!
- Python中文分词及词频统计
- nginx中deny和allow详解
- qmail邮件系统(五)vpopmail和qmailadmin对用户的管理
- error: cannot connect to daemon