Oracle Sql 到带有命名空间的属性

Oracle Sql to attribute with namespace

我正在尝试使用 Oracle sql 语句将属性添加到 xml。 XML 作为数据存储在 table 'item' 的列中。我没有问题添加一个新的 'id' 属性,其值为“123”,如下面的查询所示。

UPDATE item SET item_xml = INSERTCHILDXML(item_xml , '/item','@id', '123') where customer_id = '1';

但是,如果我添加 xml 命名空间而不是常规的 'id' 属性,如果我想在 xml 下面附加像 'xml:id' 这样的命名空间,则会抛出错误 '无效的 XPATH 表达式',请告诉我避免抛出此错误的方法

UPDATE item SET item_xml = INSERTCHILDXML(item_xml , '/item','@xml:id', '123') where customer_id = '1';

我知道我们在普通情况下不使用命名空间,但是我以 'id' 属性为例,因为我们的应用程序生成 xml,它在其他需要带有命名空间的属性的系统中使用几个属性。

更新后 xml 应该如下所示,请假设属性 'xml:id="123"' 最初不存在于 table [=24= 的 xml clob 中].

<items>
  <item xml:id="123">Apple</item>
<items>

我认为这不受支持。

您可以使用 modify XPath 来完成;副作用是名称空间声明出现在属性中,即使它已经在文档中声明;希望不会影响您的下游系统:

UPDATE item SET item_xml = XMLQuery('
  copy $n := .
  modify (  
    for $i in $n/items/item[$item][not(@xml:id)]
      return insert node attribute xml:id {$id} into $i
    )
  return $n'
  passing item_xml, 'Apple' as "item", 123 as "id"
  returning content
)
where customer_id = 1;
ITEM_XML
----------------------------------------------------------------------------------
<items>
  <item xml:id="123" xmlns:xml="http://www.w3.org/XML/1998/namespace">Apple</item>
</items>

db<>fiddle

我已经将项目值和 ID 值作为参数传递,而不是 hard-coding 在 XPath 中传递它们;根据您 link 这些东西的位置和方式,您可以对所有行进行一次更新,从另一个 table.

获取 item/ID 映射

这在更高版本的 Oracle e.g. 18c 中有效,我相信应该从 11.2.0.3 开始有效。它在早期版本中不起作用,所以如果你真的在 10g 上,那么它需要不同的方法。