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>
我已经将项目值和 ID 值作为参数传递,而不是 hard-coding 在 XPath 中传递它们;根据您 link 这些东西的位置和方式,您可以对所有行进行一次更新,从另一个 table.
获取 item/ID 映射
这在更高版本的 Oracle e.g. 18c 中有效,我相信应该从 11.2.0.3 开始有效。它在早期版本中不起作用,所以如果你真的在 10g 上,那么它需要不同的方法。
我正在尝试使用 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>
我已经将项目值和 ID 值作为参数传递,而不是 hard-coding 在 XPath 中传递它们;根据您 link 这些东西的位置和方式,您可以对所有行进行一次更新,从另一个 table.
获取 item/ID 映射这在更高版本的 Oracle e.g. 18c 中有效,我相信应该从 11.2.0.3 开始有效。它在早期版本中不起作用,所以如果你真的在 10g 上,那么它需要不同的方法。