当前位置: 首页 > news >正文

OceanBase v4.2 特性解析:对Json与Xml的扩展支持

1. 背景

OceanBase的Oracle模式当前已实现对XMLType类型的支持,不仅包含了基本的构造、查询、更新以及格式转换功能,还支持使用Xpath查询从XML数据中提取特定值。在V 4.2.2 版本中,我们进一步扩展了Oracle模式下对XMLType的支持,新增了通过XMLTable将XML数据转换为关系表的能力,同时提供了在XML中删除和插入特定片段的功能。此外,OB在MySQL模式下也提供了与MySQL 8.0相同的XML表达式。

关于Json,本期特性在 MySQL模式下,补充了JSON Schema的校验能力,MySQL模式已经支持了MySQL 8.0的所有Json表达式;此外,在OB-Oracle模式下补充了PL下的JSON_ARRAY_T类型。

1.1. XML部分

特性1: 将XML数据从半结构化数据转为结构化数据

新增XMLTABLE、XMLSEQUENCE两个表达式,在原来增删改查的基础上拓展了XML功能。

XMLTABLE能力包括:

  1. 数据抽取能力。

XMLTABLE中可以指定父xpath抽取所需数据。

  1. 半结构化数据结构化能力。

XMLTABLE可以将XML数据的各个部分映射到虚拟表的行和列中,生成一个结构化的表信息,方便查询。也可以将生成的虚拟表插入到新表或者视图中。

XMLSEQUENCE将一个XML中的顶层原元素放到一个数组中,结合Table函数也可实现部分XMLTABLE的能力。

特性2: 补充对XML内容修改的能力

  • 插入: INSERTCHILDXML在XML内容中插入指定XML片段;
  • 删除: DELETEXML删除指定XML片段。

特性3: MySQL模式下的XML功能

补充MySQL的XML表达式功能:EXTRACTVALUE、UPDATEXML。

1.2. JSON部分

特性1: JSON SCHEMA功能支持

新增JSON SCHEMA相关2个表达式:JSON_SCHEMA_VALID和JSON_SCHEMA_VALIDATION_REPORT。使用JSON SCHEMA 验证输入的JSON数据是否符合要求。

特性2: JSON表达式补齐

补充JSON_ARRAY_T、JSON_ARRAY_APPEND表达式。

2. 使用操作

2.1. 本次特性支持的表达式总览

模块表达式名称功能简述
MySQLJSON_SCHEMA_VALID符合SCHEMA则返回true,不符合则返回false。
JSON_SCHEMA_VALIDATION_REPORT返回JSON SCHEMA验证报告,验证报告为JSON格式。
OracleINSERTCHILDXML插入孩子节点到XML中。
DELETEXML删除xpath表达式再XML中匹配的一个或多个节点。
MySQLEXTRACTVALUE依据Xpath抽取一个XML片段,返回文本内容。
UPDATEXML更新指定XML。
MySQLJSON_ARRAY_APPEND追加值到指定路径所指向的JSON数据的末尾,并返回追加后的结果。
OracleXMLTABLE将 Xpath 返回的结果映射到关系表的行和列中。
OracleXMLSEQUENCE生成包含XML文档内容的XML array。
OracleJSON_ARRAY_T生成JSON_ARRAY_T类型,并提供相关udf使用

2.2. JSON SCHEMA表达式

JSON SCHEMA 是描述 JSON 格式的一个标准模板,用于验证输入的JSON数据是否符合要求。JSON SCHEMA 本身也是一个 JSON数据,且一定是Object类型。使用Json Schema进行校验时,会同步遍历Schema和校验数据,根据遍历到的数据对应的规范去检验是否符合要求。

2.2.1. JSON_SCHEMA_VALID

符合SCHEMA则返回true,不符合则返回false。可用作列约束。

-- 符合JSON SCHEMA规范返回1, 不符合则返回0
MySQL [mydb]> SELECT JSON_SCHEMA_VALID('{"type": "string"}', '"JSON_doc"');
+-------------------------------------------------------+
| JSON_SCHEMA_VALID('{"type": "string"}', '"JSON_doc"') |
+-------------------------------------------------------+
|                                                     1 |
+-------------------------------------------------------+
1 row in set (0.00 sec)

2.2.2. JSON_SCHEMA_VALIDATION_REPORT

返回验证报告,验证报告为JSON格式;

MySQL [mydb]> SELECT JSON_SCHEMA_VALIDATION_REPORT('{"type": "string"}', '"JSON_doc"');
+-------------------------------------------------------------------+
| JSON_SCHEMA_VALIDATION_REPORT('{"type": "string"}', '"JSON_doc"') |
+-------------------------------------------------------------------+
| {"valid": true}                                                   |
+-------------------------------------------------------------------+
1 row in set (0.00 sec)

2.3. Table相关表达式

2.3.1. Oracle XMLTABLE

XMLTABLE将 Xpath 返回的结果映射到关系行和列中。您可以使用 SQL 将函数返回的结果作为虚拟关系表进行查询。

OceanBase(SYS@SYS)>SELECT * FROM -> XMLTABLE('/ROWS/ROW' -> passing XMLtype(->   '<ROWS>'>   <ROW id="20">'>   <COUNTRY_ID>EG</COUNTRY_ID>'>   <COUNTRY_NAME>Egypt</COUNTRY_NAME>'>   <REGION_ID>1</REGION_ID>'>   </ROW>'>   </ROWS>')) XMLTABLE;
+---------------------------------------------------------------------------------------------------------------------+
| COLUMN_VALUE                                                                                                        |
+---------------------------------------------------------------------------------------------------------------------+
| <ROW id="20"><COUNTRY_ID>EG</COUNTRY_ID><COUNTRY_NAME>Egypt</COUNTRY_NAME><REGION_ID>1</REGION_ID>
</ROW>|
+---------------------------------------------------------------------------------------------------------------------+
1 row in set (0.005 sec)

2.3.2. Oracle XMLSEQUENCE

返回一个varray,其中包括输入XML数据的所有顶层节点。

OceanBase(SYS@SYS)>SELECT rownum,->   column_value-> FROM TABLE(XMLSEQUENCE(extract(XMLtype('<Videogame>'> <Type>Racing</Type>'> <Name>NFS Most Wanted</Name>'> <Version>2.0</Version>'> <Size>5.5 GB</Size>'> </Videogame>'),'/Videogame/*')));
+--------+-------------------------------+
| ROWNUM | COLUMN_VALUE                  |
+--------+-------------------------------+
|      1 | <Type>Racing</Type>|
|      2 | <Name>NFS Most Wanted</Name>|
|      3 | <Version>2.0</Version>|
|      4 | <Size>5.5 GB</Size>|
+--------+-------------------------------+
4 rows in set (0.051 sec)

2.4. 修改XML数据的表达式

2.4.1. Oracle INSERTCHILDXML

在xpath指定的位置插入孩子节点到XML中。

OceanBase(SYS@SYS)>select INSERTCHILDXML(XMLtype(->   '<bookstore><book att="old"></book>'>    <author>carrot</author>'>    </bookstore>'), ->   '/bookstore', ->   'price', ->   XMLtype('<price>99.9</price>')) -> as result from dual;
+-----------------------------------------------------------------------------------------------+
| RESULT                                                                                        |
+-----------------------------------------------------------------------------------------------+
| <bookstore><book att="old"/><author>carrot</author><price>99.9</price>
</bookstore>|
+-----------------------------------------------------------------------------------------------+
1 row in set (0.007 sec)

2.4.2. Oracle DELETEXML

删除xpath表达式在XML中匹配的一个或多个节点。

OceanBase(SYS@SYS)>select DELETEXML(XMLtype('<bookstore>'> <book att="old"></book>'> <author>carrot</author>'> </bookstore>'), -> '/bookstore/author')-> as result-> from dual;
+-----------------------------------------------+
| RESULT                                        |
+-----------------------------------------------+
| <bookstore><book att="old"/>
</bookstore>|
+-----------------------------------------------+
1 row in set (0.006 sec)

2.4.3. MySQL EXTRACTVALUE

依据Xpath抽取一个XML片段,返回文本内容。

OceanBase(root@test)>select EXTRACTVALUE('<a><b>x</b><b>y</b></a>', '/a/b') ;
+-------------------------------------------------+
| EXTRACTVALUE('<a><b>x</b><b>y</b></a>', '/a/b') |
+-------------------------------------------------+
| x y                                             |
+-------------------------------------------------+
1 row in set (0.003 sec)

2.4.4. MySQL UPDATEXML

将XML中被Xpath指定的部分替换为新值。

OceanBase(root@test)>select UPDATEXML('<a/><b/>', '/a', '<x>carrot</x>');
+----------------------------------------------+
| UPDATEXML('<a/><b/>', '/a', '<x>carrot</x>') |
+----------------------------------------------+
| <x>carrot</x><b></b>                         |
+----------------------------------------------+
1 row in set (0.003 sec)

2.5. 修改JSON数据的表达式

2.5.1. JSON_ARRAY_APPEND

JSON_APPEND用于追加值到指定路径所指向的JSON数据的末尾,并返回追加后的结果。如果是数组,将追加到数组的最后,如果是非数组,则会自动生成一个JSON array并返回结果。

SET @j = '["a", ["b", "c"], "d"]';
SELECT JSON_APPEND(@j, '$[1]', 1);
+----------------------------------+
| JSON_APPEND(@j, '$[1]', 1) |
+----------------------------------+
| ["a", ["b", "c", 1], "d"]        |
+----------------------------------+

2.6. Oracle JSON表达式

2.6.1. JSON_ARRAY_T

2.6.1.1. 构造函数

构造JSON_ARRAY_T

declarejo JSON_ARRAY_T;
beginjo := JSON_ARRAY_T('[123]');dbms_output.put_line(jo.to_String);
end;
/
2.6.1.2. 通过下标获取元素
declarejo JSON_ARRAY_T;jo_val JSON_ELEMENT_T;
beginjo := JSON_ARRAY_T.parse('[123,{"abc":456},[789], true, null,"test"]');FOR I IN 0 .. 5 LOOPjo_val := jo.get(i);dbms_output.put_line(jo_val.to_String);END LOOP;
end;
/

3. 未来规划

Oracle模式下,基于高频用户场景进一步补充 XML,和Json能力,如PL下的XMLGEN,XMLDOM package。MySQL模式下的XML,JSON表达式能力已经与MySQL 8.0完全对齐,MySQL模式下的JSON多值索引已在近期规划中,未来也有计划对JSON场景做进一步的性能优化。

相关文章:

OceanBase v4.2 特性解析:对Json与Xml的扩展支持

1. 背景 OceanBase的Oracle模式当前已实现对XMLType类型的支持&#xff0c;不仅包含了基本的构造、查询、更新以及格式转换功能&#xff0c;还支持使用Xpath查询从XML数据中提取特定值。在V 4.2.2 版本中&#xff0c;我们进一步扩展了Oracle模式下对XMLType的支持&#xff0c;…...

《框架封装 · 统一异常处理和返回值包装》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

深入WebKit:揭秘复杂文档的高效渲染之道

深入WebKit&#xff1a;揭秘复杂文档的高效渲染之道 在当今信息爆炸的时代&#xff0c;网页不再仅仅是简单的文本和图片的集合&#xff0c;而是充满了复杂布局和丰富媒体内容的交互式平台。WebKit 作为众多流行浏览器的心脏&#xff0c;其布局引擎承担着将 HTML、CSS 代码转换…...

进程的控制-孤儿进程和僵尸进程

孤儿进程 &#xff1a; 一个父进程退出&#xff0c;而它的一个或多个子进程还在运行&#xff0c;那么那些子进程将成为孤儿进程。孤儿进程将被 init 进程( 进程号为 1) 所收养&#xff0c;并由 init 进程对它们完成状态收集工作 为了释放子进程的占用的系统资源&#xff1a; …...

【Unity navigation面板】

【Unity navigation面板】 Unity的Navigation面板是一个集成在Unity编辑器中的界面&#xff0c;它允许开发者对导航网格&#xff08;NavMesh&#xff09;进行配置和管理。 Unity Navigation面板的一些关键特性和功能&#xff1a; 导航网格代理&#xff08;NavMesh Agent&…...

二刷算法训练营Day53 | 动态规划(14/17)

目录 详细布置&#xff1a; 1. 392. 判断子序列 2. 115. 不同的子序列 详细布置&#xff1a; 1. 392. 判断子序列 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余…...

将缓冲文件写到磁盘中的命令sync

将缓冲文件写到磁盘中的命令sync There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should leave quick…...

灵活视图变换器:为扩散模型设计的革新图像生成架构

在自然界中&#xff0c;图像的分辨率是无限的&#xff0c;而现有的图像生成模型在跨任意分辨率泛化方面存在困难。虽然扩散变换器&#xff08;DiT&#xff09;在特定分辨率范围内表现出色&#xff0c;但在处理不同分辨率的图像时却力不从心。为了克服这一限制&#xff0c;来自上…...

[终端安全]-1 总体介绍

有朋友一直在和笔者研讨智驾安全这个热门话题&#xff0c;笔者十多年工作从不离终端安全这个核心话题&#xff08;芯片安全、操作系统安全、应用安全&#xff09;&#xff0c;近来也一直在梳理终端安全体系&#xff1b;手机、汽车皆是我们生活中应用最普遍的智能终端&#xff0…...

Mysql5.7并发插入死锁问题

死锁的产生条件 互斥、请求和保持、不可剥夺、循环等待 MySQL锁类型 死锁复现 环境&#xff1a;Mysql 5.7版本&#xff0c;Innodb引擎&#xff0c;可重复度隔离级别 并发场景下使用duplicate key update插入或更新数据可能会造成死锁&#xff0c;下面就产生死锁的条件进行模…...

网络“ping不通”,如何排查和解决呢?

网络问题往往复杂且难以预测&#xff0c;其中“ping不通”是常见的网络故障之一。 1. 确认问题现象 首先&#xff0c;明确问题是完全无法ping通(无响应)还是ping通但有高延迟或丢包。这有助于缩小问题范围。 2. 本地检查 网络接口状态&#xff1a;使用ifconfig(Linux)或ipc…...

日常学习--20240706

1、udp协议的特点有哪些&#xff1f; a、无连接&#xff0c;发送和接收数据不需要建立连接&#xff0c;开销小&#xff0c;实时性好 b、不可靠传输&#xff0c;不保证数据包能够到达目的地&#xff0c;也不保证数据包的顺序 c、面向数据报的&#xff0c;以数据报形式发送数据…...

入门PHP就来我这(高级)12 ~ 获取数据

有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 1 从结果集中获取一行作为对象 表中数据行如下&#xff1a; 利用mysqli_fetch_array()函数获…...

AIGC专栏12——EasyAnimateV3发布详解 支持图文生视频 最大支持960x960x144帧视频生成

AIGC专栏12——EasyAnimateV3发布详解 支持图&文生视频 最大支持960x960x144帧视频生成 学习前言项目特点生成效果相关地址汇总项目主页Huggingface体验地址Modelscope体验地址源码下载地址 EasyAnimate V3详解技术储备Diffusion Transformer (DiT)Hybrid Motion ModuleU-V…...

【python】python猫眼电影数据抓取分析可视化(源码+数据集+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…...

Android 四大组件

1. Activity 应用程序中&#xff0c;一个Activity通常是一个单独的屏幕&#xff0c;它上面可以显示一些控件&#xff0c;也可以监听并对用户的事件做出响应。 Activity之间通过Intent进行通信&#xff0c;在Intent 的描述结构中&#xff0c;有两个最重要的部分&#xff1a;动…...

【Python】已解决:ModuleNotFoundError: No module named ‘nltk’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;ModuleNotFoundError: No module named ‘nltk’ 一、分析问题背景 在使用Python进行自然语言处理或文本分析时&#xff0c;我们经常会用到各种库来辅助我们的工…...

【Docker系列】Docker 命令行输出格式化指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

使用Netty构建高性能的网络应用

使用Netty构建高性能的网络应用 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; Netty是一个基于Java NIO的异步事件驱动的网络应用框架&#xff0c;专为快速开发高性能、高可靠性的网络服务器和客户…...

C++11新特性【下】{lambda表达式、可变模板参数、包装器}

一、lambda表达式 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法。如果待排序元素为自定义类型&#xff0c;需要用户定义排序时的比较规则&#xff0c;随着C语法的发展&#xff0c;人们开始觉得上面的写法太复杂了&#xff0c…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...