在这篇文章中《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支持功能增强相关推荐

  1. SQL Server 2016中的本机JSON支持

    With the introduction of SQL Server 2016, Microsoft introduced many new features which had taken SQL ...

  2. Oracle 21C 新特性:数据泵相关新特性汇总

    墨墨导读:本文来自墨天轮用户"JiekeXu"投稿,墨天轮主页:https://www.modb.pro/u/434,本文分享Oracle 21c 新特性:数据泵相关新特性汇总. ...

  3. json oracle 导入,JsonToOracle(Json导入Oracle工具)

    JsonToOracle(Json导入Oracle工具) JsonToOracle(Json导入Oracle工具)软件简介:JsonToOracle(Json导入Oracle工具)是一款够用以将Jso ...

  4. 集成开发环境PL/SQL Developer v13.0新功能(二)——PL / SQL美化功能增强

    Allround Automations是一家位于荷兰的私人控股公司.该公司成立于1989年,在Oracle开发工具方面是全球领先的服务提供商.其中,产品PL/SQL Developer是一个集成开发 ...

  5. datagrid底部显示水平滚动_DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强

    行业领先的.NET界面控件DevExpress 日前正式发布v19.1版本,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WPF v19.1中新增的一些控件及部 ...

  6. PostgreSQL 10.0 preview 功能增强 - 后台运行(pg_background)

    标签 PostgreSQL , 10.0 , 后台运行 , pg_background_launch , pg_background_result , pg_background_detach , p ...

  7. Elixir 1.2带来多项功能增强和性能提升

    José Valim宣布了Elixir这门动态.函数式编程语言的1.2版本. \\ Valim是Elixir的创建者.他表示,1.2版本"带来了功能增强.Bug修复.性能提升等等" ...

  8. oracle hyperion招聘,Hyperion Planning功能顾问

    岗位职责: 1. 负责预算系统优化业务需求调研分析.方案设计和文档编写: 2. 参与预算系统优化实施工作,及时反馈外部资源的实施情况,负责实施质量的把控: 3. 参与预算系统的日常运维工作,能够解决用 ...

  9. VB.NET完成一个功能增强的记事本

    VB.NET完成一个功能增强的记事本 分类: DotNet 2011-07-02 16:05 153人阅读 评论(0)收藏 举报 想必大家都听说过Notepad2,Notepad++一类的记事本增强软 ...

最新文章

  1. 详解Jedis连接池报错处理
  2. 山东省各2021高考成绩查询,关于2021年山东省高考成绩查询系统入口【官网】
  3. rqnoj 496 [IOI1999]花店橱窗布置 (简单dp)
  4. python之turtle库(画图)
  5. 多行字符串的表示方式
  6. 信息学奥赛一本通(1257:Knight Moves)
  7. ajax控件扩展,22.6 扩展控件
  8. 乳化液稳定剂php,乳化液稳定剂PHP对小于0.1mm煤泥浮选的影响
  9. Java生成验证码合集(一)简单版
  10. vue 非父子组件传值
  11. linux输入中文老是有字母,Fcitx 中文输入法中世界语字母的输入方法
  12. Words Reciting 2016.5.4
  13. 在laravel中使用wordpress
  14. 51单片机数码管显示数字及小数点
  15. 微信小程序uniapp高德开放平台路线规划1对多导航路线方法记录
  16. 处理各种压力(情绪、家庭)时,需要注意什么!
  17. Python中文分词及词频统计
  18. nginx中deny和allow详解
  19. qmail邮件系统(五)vpopmail和qmailadmin对用户的管理
  20. error: cannot connect to daemon

热门文章

  1. 基于图像的虚拟试衣:VITON:An Image-based Virtual Try-on Network(2018)
  2. ProcessingJoy ——圆点和直线马赛克效果【JAVA】
  3. China-open-ssl编译的一些记录
  4. html制作电影宣传效果,为你的网页做出电影的过场效果_html
  5. 3876: [Ahoi2014Jsoi2014]支线剧情
  6. 科技型中小企业税收优惠政策
  7. PHPCMS标题设置
  8. 开源软件使用的风险和应对方法
  9. 推荐6个好用又冷门的手机APP,非常强大
  10. 构建智慧图书馆从哪方面入手