PG 开源社区喜迎 IvorySQL 3.2 版本

PG 开源社区喜迎 IvorySQL 3.2 版本

严少安 Lv.6

IvorySQL 3.2 于 4 月 11 日发版,这是 IvorySQL 3.x 系列的第三个版本。

先来简单回忆下之前的版本。

IvorySQL 合集

编译安装 IvorySQL 3.2

与之前版本略有不同,这里推荐在默认配置参数上增加 --with-libxml 选项,以支持 XML 函数。

具体步骤略,启动数据库后,查看版本信息。

1
2
3
4
5
ivorysql=# select version();
version
---------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 16.2-ShawnYan (IvorySQL 3.2) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
(1 row)

可以看到 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
2
3
4
5
6
7
8
9
[ivorysql@shawnyan /data/ivorysql 12:03:34]$ psql -p1521
psql (16.2-ShawnYan)
Type "help" for help.

ivorysql=# show ivorysql.compatible_mode ;
ivorysql.compatible_mode
--------------------------
oracle
(1 row)

查看下 IvorySQL 支持哪些 XML 函数。

1
2
3
4
5
6
7
8
9
            Name            |       Internal name        | Result data type |        Argument data types         
----------------------------+----------------------------+------------------+------------------------------------
appendchildxml | ivy_appendchildxml | xmltype | xmltype, text, xmltype
appendchildxml | ivy_appendchildxml2 | xmltype | xmltype, text, xmltype, text
deletexml | ivy_deletexml | xmltype | xmltype, text
deletexml | ivy_deletexml2 | xmltype | xmltype, text, text
existsnode | ivy_existsnode | pg_catalog.int4 | xmltype, text
existsnode | ivy_existsnode2 | pg_catalog.int4 | xmltype, text, text
...

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
2
3
4
5
6
7
8
ivorysql=# SELECT APPENDCHILDXML('<root><id>1</id></root>','/root','<val>ora</val>');
appendchildxml
------------------
<root> +
<id>1</id> +
<val>ora</val>+
</root>
(1 row)

扩展:

该函数在 Oracle 中已经废弃,依旧作为兼容性支持,Oracle 推荐使用 XQuery Update 来代替。

2. DELETEXML

这个函数用于从 XML 文档中删除指定的节点或元素。

示例:

id 节点删除。

1
SELECT DELETEXML('<root><id>1</id></root>','/root/id');
1
2
3
4
5
ivorysql=# SELECT DELETEXML('<root><id>1</id></root>','/root/id');
deletexml
-----------
<root/>
(1 row)

3. EXISTSNODE

这个函数用于检查 XML 文档中是否存在满足特定条件的节点。

如果满足条件,函数返回 1,否则返回 0。

示例:

检查是否存在 /root 节点。

1
SELECT EXISTSNODE('<root><id>1</id></root>','/root');
1
2
3
4
5
ivorysql=# SELECT EXISTSNODE('<root><id>1</id></root>','/root');
existsnode
------------
1
(1 row)

检查是否存在 /root/id2 节点。

1
SELECT EXISTSNODE('<root><id>1</id></root>','/root/id2');
1
2
3
4
5
ivorysql=# SELECT EXISTSNODE('<root><id>1</id></root>','/root/id2');
existsnode
------------
0
(1 row)

4. EXTRACT (XML)

这个函数用于提取 XML 文档的一部分或整个文档,可以使用初始斜杠指定绝对路径,也可以通过省略初始斜杠指定相对路径。

示例:

1
SELECT EXTRACT(xmltype('<root><id>1</id></root>'),'/root/id');
1
2
3
4
5
ivorysql=# SELECT EXTRACT(xmltype('<root><id>1</id></root>'),'/root/id');
extract
------------
<id>1</id>
(1 row)

注意:

这个函数需要显示指定 xmltype,否则会报错。

1
2
3
4
5
ivorysql=# SELECT EXTRACT('<root><id>1</id></root>','/root/id');
ERROR: function extract(unknown, unknown) is not unique
LINE 1: SELECT EXTRACT('<root><id>1</id></root>','/root/id');
^
HINT: Could not choose a best candidate function. You might need to add explicit type casts.

5. EXTRACTVALUE

这个函数用于从 XML 文档中定位和提取特定元素的值。

示例:

1
SELECT EXTRACTVALUE(xmltype('<root><id>1</id></root>'),'/root/id');
1
2
3
4
5
ivorysql=# SELECT EXTRACTVALUE(xmltype('<root><id>1</id></root>'),'/root/id');
extractvalue
--------------
1
(1 row)

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
2
3
4
5
6
7
8
9
ivorysql=# SELECT INSERTCHILDXML('<root><id>1</id><id>2</id></root>', '/root', 'id', '<id>0</id>');
insertchildxml
----------------
<root> +
<id>1</id> +
<id>2</id> +
<id>0</id> +
</root>
(1 row)

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
2
3
4
5
6
7
8
9
ivorysql=# SELECT INSERTCHILDXMLAFTER('<root><id>1</id><id>2</id></root>', '/root', 'id[1]', '<id>1.5</id>');
insertchildxmlafter
---------------------
<root> +
<id>1</id> +
<id>1.5</id> +
<id>2</id> +
</root>
(1 row)

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
2
3
4
5
6
7
8
9
ivorysql=# SELECT INSERTCHILDXMLBEFORE('<root><id>1</id><id>2</id></root>', '/root', 'id[2]', '<id>1.8</id>');
insertchildxmlbefore
----------------------
<root> +
<id>1</id> +
<id>1.8</id> +
<id>2</id> +
</root>
(1 row)

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
2
3
4
5
6
7
8
9
10
ivorysql=# SELECT INSERTXMLAFTER('<root><id>1</id><id>2</id></root>', '/root/id', '<id>1.5</id>');
insertxmlafter
----------------
<root> +
<id>1</id> +
<id>1.5</id>+
<id>2</id> +
<id>1.5</id>+
</root>
(1 row)

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
2
3
4
5
6
7
8
9
10
ivorysql=# SELECT INSERTXMLBEFORE('<root><id>1</id><id>2</id></root>', '/root/id', '<id>1.5</id>');
insertxmlbefore
-----------------
<root> +
<id>1.5</id> +
<id>1</id> +
<id>1.5</id> +
<id>2</id> +
</root>
(1 row)

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
2
3
4
5
6
7
8
9
10
ivorysql=# SELECT UPDATEXML('<root><id>1</id><val>x1</val><id>2</id><val>x2</val></root>','/root/val[1]','<val>01</val>');
updatexml
-----------------
<root> +
<id>1</id> +
<val>01</val>+
<id>2</id> +
<val>x2</val>+
</root>
(1 row)

总结

本文介绍了 IvorySQL 3.2 为兼容 Oracle 而增加的 11 个 XML 函数。

这些函数为开发者提供了强大的工具,以便高效地处理 XML 数据。

通过这些函数,可以构建、修改和查询 XML 文档,以满足各种业务需求。

– END –

logo.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.
 Comments