Oracle
 sql >> база данни >  >> RDS >> Oracle

Промяна на стойността на XML възел - UpdateXML еквивалент за Oracle 12c

Документацията на Oracle препоръчва използването на XQuery за актуализиране на XML . Така че е първото нещо, което трябва да опитате.

Първо, това е възможно със стар подход с функция. XQuery по-долу може да се използва вместо извикване на 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  

Друг, по-кратък и по-интуитивен вариант:

    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 ...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразувайте keep dense_rank от Oracle заявка в postgres

  2. С изключение на неподдържани таблици, които да бъдат заснети от потоци на Oracle

  3. Решение да не може да изпълни DML операция в заявка?

  4. Еквивалент на външни таблици на Oracle в SQL Server

  5. Изберете подробности за база данни и имена на таблици в iSQL plus