Oracle दस्तावेज़ एक्सएमएल को अपडेट करने के लिए XQuery का उपयोग करने की अनुशंसा करता हैए> . तो कोशिश करना पहली बात है।
सबसे पहले, फ़ंक्शन के साथ पुराने दृष्टिकोण के साथ यह संभव है। XmlUpdate
पर कॉल करने के बजाय नीचे दिए गए XQuery का उपयोग किया जा सकता है :
XMLQuery(
'
declare function local:copy-replace($element as element()) {
if ($element/self::node_2) then <node_2/>
else if ($element/self::node_3) then <node_3/>
else if ($element/self::node_4) then <node_4/>
else element {node-name($element)}
{$element/@*,
for $child in $element/node()
return if ($child instance of element())
then local:copy-replace($child)
else $child
}
};
local:copy-replace($p/*)
'
passing x as "p" returning content
) as xcol_2
एक और, छोटा और अधिक सहज ज्ञान युक्त संस्करण:
XMLQuery(
'
copy $p2 := $p
modify(
replace value of node $p2/node_root/node_2 with "",
replace value of node $p2/node_root/node_3 with "",
replace value of node $p2/node_root/node_4 with ""
)
return $p2
'
passing x as "p" returning content
) as xcol_3
और इसके अलावा, संशोधित XML मान केवल तभी लौटाया जा सकता है जब शर्त मेल न खाए:
WITH xtbl AS
(SELECT 1 AS xtbl_id,
xmltype ('<node_root>
<node_1>12</node_1>
<node_2>233</node_2>
<node_3>223</node_3>
<node_4>234</node_4>
</node_root>') AS x
FROM Dual
UNION ALL
SELECT 2, xmltype ('<node_root>
<node_1></node_1>
<node_2>233</node_2>
<node_3>223</node_3>
<node_4>234</node_4>
</node_root>')
FROM Dual)
SELECT xtbl_id,
x,
XMLQuery(
'
for $test in $p/*
return
if( empty($p/node_root/node_1/text()) )
then $p
else (
copy $p2 := $p
modify(
replace value of node $p2/node_root/node_2 with "",
replace value of node $p2/node_root/node_3 with "",
replace value of node $p2/node_root/node_4 with ""
)
return $p2
)
'
passing x as "p" returning content
) as xcol_4
FROM xtbl
इसलिए XML मानों पर संचालन करने के लिए कई प्रकार हैं, लेकिन इसके लिए XQuery और XPath अपेक्षाकृत सरल XmlUpdate फ़ंक्शन की तुलना में ...