![PG 开源社区喜迎 IvorySQL 3.2 版本](https://oss-emcsprod-public.modb.pro/image/editor/20240406-f139dcfe-1a86-4567-9a1c-932b1a769d00.png)
PG 开源社区喜迎 IvorySQL 3.2 版本
![](/img/avatar.jpg)
IvorySQL 3.2 于 4 月 11 日发版,这是 IvorySQL 3.x 系列的第三个版本。
先来简单回忆下之前的版本。
编译安装 IvorySQL 3.2
与之前版本略有不同,这里推荐在默认配置参数上增加 --with-libxml
选项,以支持 XML 函数。
具体步骤略,启动数据库后,查看版本信息。
1 | ivorysql=# select version(); |
可以看到 IvorySQL 3.2 基于 PostgreSQL 16.2,也是目前 PG 最新的版本。
题外话,
PostgreSQL 17 已在开发中,估计 IvorySQL 4 也在低调推进中。
不知会有哪些新特性呢?
IvorySQL 3.2 新增支持的 XML 函数
在 Oracle 数据库中,提供了一系列的 XML 函数,用于处理和操作 XML 数据。
IvorySQL 3.2 新增支持了几个 XML 函数,用于兼容 Oracle 的这一特性。
接下来,我们逐一解析。
0. 查看 XML 函数
连接到 IvorySQL 的 Oracle 模式:
1 | [ivorysql@shawnyan /data/ivorysql 12:03:34]$ psql -p1521 |
查看下 IvorySQL 支持哪些 XML 函数。
1 | Name | Internal name | Result data type | Argument data types |
1. APPENDCHILDXML
这个函数用于将一个 XML 片段作为子元素添加到指定的 XML 文档或元素中。
示例:
将值 '<val>ora</val>'
作为 '/root'
的子节点,追加到 '<root><id>1</id></root>'
中。
1 | SELECT APPENDCHILDXML('<root><id>1</id></root>','/root','<val>ora</val>'); |
1 | ivorysql=# SELECT APPENDCHILDXML('<root><id>1</id></root>','/root','<val>ora</val>'); |
扩展:
该函数在 Oracle 中已经废弃,依旧作为兼容性支持,Oracle 推荐使用 XQuery Update 来代替。
2. DELETEXML
这个函数用于从 XML 文档中删除指定的节点或元素。
示例:
将 id
节点删除。
1 | SELECT DELETEXML('<root><id>1</id></root>','/root/id'); |
1 | ivorysql=# SELECT DELETEXML('<root><id>1</id></root>','/root/id'); |
3. EXISTSNODE
这个函数用于检查 XML 文档中是否存在满足特定条件的节点。
如果满足条件,函数返回 1,否则返回 0。
示例:
检查是否存在 /root
节点。
1 | SELECT EXISTSNODE('<root><id>1</id></root>','/root'); |
1 | ivorysql=# SELECT EXISTSNODE('<root><id>1</id></root>','/root'); |
检查是否存在 /root/id2
节点。
1 | SELECT EXISTSNODE('<root><id>1</id></root>','/root/id2'); |
1 | ivorysql=# SELECT EXISTSNODE('<root><id>1</id></root>','/root/id2'); |
4. EXTRACT (XML)
这个函数用于提取 XML 文档的一部分或整个文档,可以使用初始斜杠指定绝对路径,也可以通过省略初始斜杠指定相对路径。
示例:
1 | SELECT EXTRACT(xmltype('<root><id>1</id></root>'),'/root/id'); |
1 | ivorysql=# SELECT EXTRACT(xmltype('<root><id>1</id></root>'),'/root/id'); |
注意:
这个函数需要显示指定 xmltype,否则会报错。
1 | ivorysql=# SELECT EXTRACT('<root><id>1</id></root>','/root/id'); |
5. EXTRACTVALUE
这个函数用于从 XML 文档中定位和提取特定元素的值。
示例:
1 | SELECT EXTRACTVALUE(xmltype('<root><id>1</id></root>'),'/root/id'); |
1 | ivorysql=# SELECT EXTRACTVALUE(xmltype('<root><id>1</id></root>'),'/root/id'); |
6. INSERTCHILDXML
这个函数与 APPENDCHILDXML 类似,但它允许你指定子元素的位置。
示例:
将节点 id
,值 '<id>3</id>'
作为 '/root'
的子节点,插入到 XML 中。
1 | SELECT INSERTCHILDXML('<root><id>1</id><id>2</id></root>', '/root', 'id', '<id>0</id>'); |
1 | ivorysql=# SELECT INSERTCHILDXML('<root><id>1</id><id>2</id></root>', '/root', 'id', '<id>0</id>'); |
7. INSERTCHILDXMLAFTER
这个函数用于在指定元素之后插入一个新的 XML 片段。
示例:
在 '/root'
的,第一个 id
子节点之后,插入 XML 片段。
1 | SELECT INSERTCHILDXMLAFTER('<root><id>1</id><id>2</id></root>', '/root', 'id[1]', '<id>1.5</id>'); |
1 | ivorysql=# SELECT INSERTCHILDXMLAFTER('<root><id>1</id><id>2</id></root>', '/root', 'id[1]', '<id>1.5</id>'); |
8. INSERTCHILDXMLBEFORE
与 INSERTCHILDXMLAFTER 类似,这个函数用于在指定元素之前插入一个新的 XML 片段。
示例:
在 '/root'
的,第二个 id
子节点之前,插入 XML 片段。
1 | SELECT INSERTCHILDXMLBEFORE('<root><id>1</id><id>2</id></root>', '/root', 'id[2]', '<id>1.8</id>'); |
1 | ivorysql=# SELECT INSERTCHILDXMLBEFORE('<root><id>1</id><id>2</id></root>', '/root', 'id[2]', '<id>1.8</id>'); |
9. INSERTXMLAFTER
这个函数与 INSERTCHILDXMLAFTER 类似,但 INSERTXMLAFTER 是在非属性节点的目标节点之后插入一个或多个任意类型的节点。
示例:
定位在 '/root/id'
节点的,并在 id
子节点之后,插入 XML 片段。
1 | SELECT INSERTXMLAFTER('<root><id>1</id><id>2</id></root>', '/root/id', '<id>1.5</id>'); |
1 | ivorysql=# SELECT INSERTXMLAFTER('<root><id>1</id><id>2</id></root>', '/root/id', '<id>1.5</id>'); |
10. INSERTXMLBEFORE
这个函数与 INSERTXMLAFTER 类似,但 INSERTXMLBEFORE 是在目标节点之前插入,而不是之后。
示例:
定位在 '/root/id'
节点的,并在 id
子节点之前,插入 XML 片段。
1 | SELECT INSERTXMLBEFORE('<root><id>1</id><id>2</id></root>', '/root/id', '<id>1.5</id>'); |
1 | ivorysql=# SELECT INSERTXMLBEFORE('<root><id>1</id><id>2</id></root>', '/root/id', '<id>1.5</id>'); |
11. UPDATEXML
这个函数用于更新 XML 文档中的元素或属性值。
示例:
将第一个 val 的属性值,更新为 01
。
1 | SELECT UPDATEXML('<root><id>1</id><val>x1</val><id>2</id><val>x2</val></root>','/root/val[1]','<val>01</val>'); |
1 | ivorysql=# SELECT UPDATEXML('<root><id>1</id><val>x1</val><id>2</id><val>x2</val></root>','/root/val[1]','<val>01</val>'); |
总结
本文介绍了 IvorySQL 3.2 为兼容 Oracle 而增加的 11 个 XML 函数。
这些函数为开发者提供了强大的工具,以便高效地处理 XML 数据。
通过这些函数,可以构建、修改和查询 XML 文档,以满足各种业务需求。
– END –
![logo.jpg](https://oss-emcsprod-public.modb.pro/image/editor/20240222-e133c9a2-37fa-47e9-9f67-d49bfdc02bdf.jpg)
如果这篇文章为你带来了灵感或启发,就请帮忙点『赞』or『在看』or『转发』吧,感谢!(๑˃̵ᴗ˂̵)
- Title: PG 开源社区喜迎 IvorySQL 3.2 版本
- Author: 严少安
- Created at: 2024-04-07 21:00:00
- Updated at: 2024-04-11 21:00:00
- Link: https://shawnyan.cn/2024/ivorysql/ivorysql-3.2-xml/
- License: This work is licensed under CC BY-NC-SA 4.0.