sql >> Databasteknik >  >> RDS >> Oracle

Ändra XML-nodvärde - UpdateXML-motsvarighet för Oracle 12c

Oracle-dokumentationen rekommenderar att använda XQuery för att uppdatera XML a> . Så det är det första du ska prova.

För det första är det möjligt med gammal metod med funktion. XQuery nedan kan användas istället för anrop till 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  

En annan, kortare och mer intuitiv 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

Och dessutom är det möjligt att returnera ett modifierat XML-värde endast om villkoret inte matchar:

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

Så det finns många varianter för att utföra operationer på XML-värden, men detta kräver djupare kunskap om XQuery och XPath än en relativt enkel XmlUpdate-funktion ...




  1. När du kör UPDATE ... datetime =NOW(); kommer alla uppdaterade rader att ha samma datum/tid?

  2. Hur använder jag Entity Framework 6 med MySQL i ASP.NET 5?

  3. 'OPTION SQL_SELECT_LIMIT=DEFAULT'

  4. SQL Välj från 2 tabeller med samma kolumnnamn returnerar endast kolumn när den inte är null