当前位置:   article > 正文

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

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。可用作列约束。

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

2.2.2. JSON_SCHEMA_VALIDATION_REPORT

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

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

2.3. Table相关表达式

2.3.1. Oracle XMLTABLE

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

  1. OceanBase(SYS@SYS)>SELECT * FROM
  2. -> XMLTABLE('/ROWS/ROW'
  3. -> passing XMLtype(
  4. -> '<ROWS>
  5. '> <ROW id="20">
  6. '> <COUNTRY_ID>EG</COUNTRY_ID>
  7. '> <COUNTRY_NAME>Egypt</COUNTRY_NAME>
  8. '> <REGION_ID>1</REGION_ID>
  9. '> </ROW>
  10. '> </ROWS>')) XMLTABLE;
  11. +---------------------------------------------------------------------------------------------------------------------+
  12. | COLUMN_VALUE |
  13. +---------------------------------------------------------------------------------------------------------------------+
  14. | <ROW id="20">
  15. <COUNTRY_ID>EG</COUNTRY_ID>
  16. <COUNTRY_NAME>Egypt</COUNTRY_NAME>
  17. <REGION_ID>1</REGION_ID>
  18. </ROW>
  19. |
  20. +---------------------------------------------------------------------------------------------------------------------+
  21. 1 row in set (0.005 sec)

2.3.2. Oracle XMLSEQUENCE

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

  1. OceanBase(SYS@SYS)>SELECT rownum,
  2. -> column_value
  3. -> FROM TABLE(XMLSEQUENCE(extract(XMLtype('<Videogame>
  4. '> <Type>Racing</Type>
  5. '> <Name>NFS Most Wanted</Name>
  6. '> <Version>2.0</Version>
  7. '> <Size>5.5 GB</Size>
  8. '> </Videogame>'),'/Videogame/*')));
  9. +--------+-------------------------------+
  10. | ROWNUM | COLUMN_VALUE |
  11. +--------+-------------------------------+
  12. | 1 | <Type>Racing</Type>
  13. |
  14. | 2 | <Name>NFS Most Wanted</Name>
  15. |
  16. | 3 | <Version>2.0</Version>
  17. |
  18. | 4 | <Size>5.5 GB</Size>
  19. |
  20. +--------+-------------------------------+
  21. 4 rows in set (0.051 sec)

2.4. 修改XML数据的表达式

2.4.1. Oracle INSERTCHILDXML

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

  1. OceanBase(SYS@SYS)>select INSERTCHILDXML(XMLtype(
  2. -> '<bookstore><book att="old"></book>
  3. '> <author>carrot</author>
  4. '> </bookstore>'),
  5. -> '/bookstore',
  6. -> 'price',
  7. -> XMLtype('<price>99.9</price>'))
  8. -> as result from dual;
  9. +-----------------------------------------------------------------------------------------------+
  10. | RESULT |
  11. +-----------------------------------------------------------------------------------------------+
  12. | <bookstore>
  13. <book att="old"/>
  14. <author>carrot</author>
  15. <price>99.9</price>
  16. </bookstore>
  17. |
  18. +-----------------------------------------------------------------------------------------------+
  19. 1 row in set (0.007 sec)

2.4.2. Oracle DELETEXML

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

  1. OceanBase(SYS@SYS)>select DELETEXML(XMLtype('<bookstore>
  2. '> <book att="old"></book>
  3. '> <author>carrot</author>
  4. '> </bookstore>'),
  5. -> '/bookstore/author')
  6. -> as result
  7. -> from dual;
  8. +-----------------------------------------------+
  9. | RESULT |
  10. +-----------------------------------------------+
  11. | <bookstore>
  12. <book att="old"/>
  13. </bookstore>
  14. |
  15. +-----------------------------------------------+
  16. 1 row in set (0.006 sec)

2.4.3. MySQL EXTRACTVALUE

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

  1. OceanBase(root@test)>select EXTRACTVALUE('<a><b>x</b><b>y</b></a>', '/a/b') ;
  2. +-------------------------------------------------+
  3. | EXTRACTVALUE('<a><b>x</b><b>y</b></a>', '/a/b') |
  4. +-------------------------------------------------+
  5. | x y |
  6. +-------------------------------------------------+
  7. 1 row in set (0.003 sec)

2.4.4. MySQL UPDATEXML

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

  1. OceanBase(root@test)>select UPDATEXML('<a/><b/>', '/a', '<x>carrot</x>');
  2. +----------------------------------------------+
  3. | UPDATEXML('<a/><b/>', '/a', '<x>carrot</x>') |
  4. +----------------------------------------------+
  5. | <x>carrot</x><b></b> |
  6. +----------------------------------------------+
  7. 1 row in set (0.003 sec)

2.5. 修改JSON数据的表达式

2.5.1. JSON_ARRAY_APPEND

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

  1. SET @j = '["a", ["b", "c"], "d"]';
  2. SELECT JSON_APPEND(@j, '$[1]', 1);
  3. +----------------------------------+
  4. | JSON_APPEND(@j, '$[1]', 1) |
  5. +----------------------------------+
  6. | ["a", ["b", "c", 1], "d"] |
  7. +----------------------------------+

2.6. Oracle JSON表达式

2.6.1. JSON_ARRAY_T

2.6.1.1. 构造函数

构造JSON_ARRAY_T

  1. declare
  2. jo JSON_ARRAY_T;
  3. begin
  4. jo := JSON_ARRAY_T('[123]');
  5. dbms_output.put_line(jo.to_String);
  6. end;
  7. /
2.6.1.2. 通过下标获取元素
  1. declare
  2. jo JSON_ARRAY_T;
  3. jo_val JSON_ELEMENT_T;
  4. begin
  5. jo := JSON_ARRAY_T.parse('[123,{"abc":456},[789], true, null,"test"]');
  6. FOR I IN 0 .. 5 LOOP
  7. jo_val := jo.get(i);
  8. dbms_output.put_line(jo_val.to_String);
  9. END LOOP;
  10. end;
  11. /

3. 未来规划

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/846066
推荐阅读
相关标签
  

闽ICP备14008679号