Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Ubah nilai simpul XML - UpdateXML setara untuk Oracle 12c

Dokumentasi Oracle merekomendasikan untuk menggunakan XQuery untuk memperbarui XML . Jadi ini hal pertama yang harus dicoba.

Pertama, itu mungkin dengan pendekatan lama dengan fungsi. XQuery di bawah ini dapat digunakan sebagai pengganti panggilan ke 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  

Varian lain, lebih pendek dan lebih intuitif:

    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

Dan selain itu, dimungkinkan untuk mengembalikan nilai XML yang dimodifikasi hanya jika kondisinya tidak cocok:

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

Jadi ada banyak varian untuk melakukan operasi pada nilai XML, tetapi ini membutuhkan pengetahuan yang lebih dalam tentang XQuery dan XPath daripada fungsi XmlUpdate yang relatif sederhana ...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pernyataan SQL Pilih Dinamis dengan MyBatis

  2. Prosedur PL/SQL:UPDATE nama huruf besar ke initcaps, dengan penanganan khusus untuk beberapa nilai

  3. Masalah TO_DATE dengan fungsi Oracle DBMS_SQL.EXECUTE

  4. Ekstensi Centos 6 PHP OCI8 tidak berfungsi (Fungsi tidak terdefinisi oci_connect ())

  5. Fungsi SQRT() di Oracle