sql >> Database >  >> RDS >> Oracle

Wijzig XML-knooppuntwaarde - UpdateXML-equivalent voor Oracle 12c

Oracle-documentatie beveelt aan om XQuery te gebruiken om XML bij te werken . Dus het is het eerste wat je moet proberen.

Ten eerste is het mogelijk met de oude benadering met functie. XQuery hieronder kan worden gebruikt in plaats van het aanroepen van XmlUpdate :

    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  

Een andere, kortere en meer intuïtieve variant:

    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

En bovendien is het alleen mogelijk om een ​​gewijzigde XML-waarde te retourneren als de voorwaarde niet overeenkomt:

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

Er zijn dus veel varianten om bewerkingen uit te voeren op XML-waarden, maar dit vereist een diepere kennis van XQuery en XPath dan een relatief eenvoudige XmlUpdate-functie ...




  1. MySQL-fout 1215:kan geen beperking voor externe sleutels toevoegen

  2. PHP date() formaat bij het invoegen in datetime in MySQL

  3. Upload meerdere bestanden naar de server waarbij php niet alle bestanden naar de server uploadt

  4. Oracle SQL Developer:Mislukt - Test mislukt:kon de netwerkadapter geen verbinding tot stand brengen?