gpt4 book ai didi

xml - 如何使用 XQUERY 在 Oracle 11g 上通过 text() 删除 XML 节点?

转载 作者:数据小太阳 更新时间:2023-10-29 02:44:07 27 4
gpt4 key购买 nike

我的问题是如何使用 Xquery 在 Oracle11g 上使用函数 text() 来删除 XML 节点。这是我的 XML 列 (USERS) 结构:

<users>
<user>user1</user>
<user>user2</user>
</users>

我是通过以下方式使用 DELETEXML 完成的:

UPDATE GROUPS SET USERS =
DELETEXML(USERS,'/users/user[text()="user1"]')
WHERE ID = 'clients';

但根据官方文档,DELETEXML 将在未来的版本中被弃用,因此我试图将此查询转换为 XMLQUERY。 https://docs.oracle.com/database/121/ADXDB/app_depr_upd.htm#ADXDB6044

UPDATE GROUPS SET USERS =
XMLQuery('copy $tmp := . modify delete node
$tmp/users/user[text()="user1"] return $tmp'
PASSING USERS RETURNING CONTENT)
WHERE ID = 'clients';

我收到以下错误:

Error report -
SQL Error: ORA-19112: error raised during evaluation: XQuery Update connot be compiled
19112. 00000 - "error raised during evaluation: %s"
*Cause: The error function was called during evaluation of the XQuery expression.
*Action: Check the detailed error message for the possible causes.

我已经研究过但没有找到解决这个问题的方法。我可以通过节点的属性 [@attribute = "something"] 或位置 [1] 删除节点,但不能通过文本删除节点。

感谢任何帮助!谢谢。

最佳答案

在 11.2.0.4 中,您的代码有效。
Xquery(version 1.0) 有两个比较运算符eq=。在大多数情况下,它的工作方式相同。但有细微差别。

  • eq - 旨在比较“单一值”
  • = - 是比较序列/集合的一般比较

11.2.0.4 可能有较新版本的 xquery 实现(版本 1.0-ml),其中放宽了此限制。

这是正确的方法。

UPDATE GROUPS SET USERS =
XMLQuery('copy $tmp := . modify delete node
$tmp/users/user[text() eq "user1"] return $tmp'
PASSING USERS RETURNING CONTENT);

这也应该有效

UPDATE GROUPS SET USERS =
XMLQuery('copy $tmp := . modify delete node
$tmp/users/user[./text()="user1"] return $tmp'
PASSING USERS RETURNING CONTENT);

关于xml - 如何使用 XQUERY 在 Oracle 11g 上通过 text() 删除 XML 节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40750153/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com