sql >> データベース >  >> RDS >> Oracle

XMLノード値の変更-Oracle12cと同等のUpdateXML

    OracleドキュメントXQueryを使用してXMLを更新することをお勧めします 。したがって、最初に試すことです。

    まず、機能を備えた古いアプローチで可能です。 XmlUpdateを呼び出す代わりに、以下の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  
    

    もう1つの、より短く、より直感的なバリアント:

        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. SQL ServerでIDENTITY_INSERTがONまたはOFFに設定されているかどうかをどのように確認しますか?

    2. HTML-mysqlから生成された選択ボックス内のオプションからテキスト領域の色を変更する

    3. タイムスタンプを使用したpostgreSQLの並べ替え

    4. MySQL、AUTO_INCREMENTを別のテーブルに渡す