sql >> Databáze >  >> RDS >> Oracle

Upravte hodnotu uzlu XML – ekvivalent UpdateXML pro Oracle 12c

Dokumentace Oracle doporučuje k aktualizaci XML použít XQuery . Takže to je první věc, kterou můžete vyzkoušet.

Za prvé, je to možné se starým přístupem s funkcí. Místo volání XmlUpdate lze použít níže uvedený 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  

Další, kratší a intuitivnější varianta:

    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

A navíc je možné vrátit upravenou hodnotu XML pouze v případě, že podmínka neodpovídá:

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

Existuje tedy mnoho variant provádění operací s hodnotami XML, ale to vyžaduje hlubší znalosti XQuery a XPath než relativně jednoduchá funkce XmlUpdate ...




  1. Jak zobrazím chybu MySQL v PHP pro dlouhý dotaz, který závisí na vstupu uživatele?

  2. Členství sady SQLAlchemy pro velmi velké sady

  3. Jsou cizí klíče při návrhu databáze skutečně nutné?

  4. Funkce SQL Server ROUND():K čemu slouží a proč by vás to mělo zajímat?