Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sửa đổi giá trị nút XML- UpdateXML tương đương cho Oracle 12c

Tài liệu Oracle khuyến nghị sử dụng XQuery để cập nhật XML . Vì vậy, đây là điều đầu tiên nên thử.

Đầu tiên, có thể với cách tiếp cận cũ với chức năng. XQuery bên dưới có thể được sử dụng thay cho lệnh gọi đến 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  

Một biến thể khác, ngắn hơn và trực quan hơn:

    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

Và ngoài ra, chỉ có thể trả về giá trị XML đã sửa đổi nếu điều kiện không phù hợp:

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

Vì vậy, có nhiều biến thể để thực hiện các thao tác trên các giá trị XML, nhưng điều này đòi hỏi kiến ​​thức sâu hơn về XQuery XPath hơn một hàm XmlUpdate tương đối đơn giản ...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. BIND BIND PL / SQL để tính thể tích lăng kính hình chữ nhật

  2. pl / sql Thủ tục đã lưu trữ ... thời gian thực hiện sẽ đi đến đâu?

  3. Oracle SQL:Chọn dữ liệu và tên phân vùng từ bảng và cắt bớt các phân vùng

  4. Bảng hoặc chế độ xem Oracle DB không tồn tại

  5. Một cách để kiểm tra Oracle đã hoàn thành sql