我有以下xml。我想添加22的值。我刚尝试了insertXMLafter;但是,它不起作用。
`
<XML>
<FRUIT_SHOP>JARVIZ</FRUIT_SHOP>
<FRUITS>
<FRUIT>
<FRUIT_NAME>ORANGE</FRUIT_NAME>
<ORANGE_FIELDS>
<FIELD>
<KEY>COLOUR</KEY>
<VALUE>LIGHT_RED</VALUE>
</FIELD>
<FIELD>
<KEY>WEIGHT</KEY>
</FIELD>
</ORANGE_FIELDS>
</FRUIT>
</FRUITS>
`
My expectation is
`<XML>
<FRUIT_SHOP>JARVIZ</FRUIT_SHOP>
<FRUITS>
<FRUIT>
<FRUIT_NAME>ORANGE</FRUIT_NAME>
<ORANGE_FIELDS>
<FIELD>
<KEY>COLOUR</KEY>
<VALUE>LIGHT_RED</VALUE>
</FIELD>
<FIELD>
<KEY>WEIGHT</KEY>
<VALUE>22</VALUE>
</FIELD>
</ORANGE_FIELDS>
</FRUIT>
</FRUITS>
`
请指导我解决这个问题......
答案 0 :(得分:0)
像以前一样使用INSERTCHILDXML
和FIELD[KEY="WEIGHT"]
来指示您需要插入的FIELD
节点。
WITH t ( old_xml, child_xml, node, field_name) AS
( SELECT
'<XML>
<FRUIT_SHOP>JARVIZ</FRUIT_SHOP>
<FRUITS>
<FRUIT>
<FRUIT_NAME>ORANGE</FRUIT_NAME>
<ORANGE_FIELDS>
<FIELD>
<KEY>COLOUR</KEY>
<VALUE>LIGHT_RED</VALUE>
</FIELD>
<FIELD>
<KEY>WEIGHT</KEY>
</FIELD>
</ORANGE_FIELDS>
</FRUIT>
</FRUITS>
</XML>
' old_xml,
'<VALUE>22</VALUE>' child_xml,
'/XML/FRUITS/FRUIT/ORANGE_FIELDS/FIELD[KEY="WEIGHT"]' node,
'VALUE' field_name
FROM dual)
SELECT
INSERTCHILDXML(XMLTYPE(old_xml),
node,
field_name,
XMLTYPE(child_xml))
FROM t;
答案 1 :(得分:0)
insertXmlAfter
从口服11g中剔除。这是一个很好描述如何用new替换旧方法的页面。 https://docs.oracle.com/database/121/ADXDB/app_depr_upd.htm#ADXDB6044
示例:
select xmlserialize(document xmlquery('copy $tmp := $doc modify (
for $row in $tmp/XML/FRUITS/FRUIT/ORANGE_FIELDS/FIELD
where not(exists($row/VALUE))
return insert node <VALUE>{$value}</VALUE> into $row
)
return $tmp'
passing xmltype('<XML>
<FRUIT_SHOP>JARVIZ</FRUIT_SHOP>
<FRUITS>
<FRUIT>
<FRUIT_NAME>ORANGE</FRUIT_NAME>
<ORANGE_FIELDS>
<FIELD>
<KEY>COLOUR</KEY>
<VALUE>LIGHT_RED</VALUE>
</FIELD>
<FIELD>
<KEY>WEIGHT</KEY>
</FIELD>
</ORANGE_FIELDS>
</FRUIT>
</FRUITS>
</XML>') as "doc", 'xxxx' as "value" returning content) as clob)
from dual;
在示例中我使用两个结构CMR(复制/修改/返回)和FLWOR(用于/ let / where / order / return)