2017-11-29 11 views
0

XMLデータを持つ列があります。XMLのテキストを置換または更新する

SELECT roll_id, EXTRACT (xml_data, '/root/xmldata/empid') AS empid 
    FROM employee_data 
WHERE roll_id IN (1, 2) 

結果:私は更新クエリの下に実行する場合

roll_id  empid 
    1  <empid>A11</empid> 
    2  <empid/> 

、それはそれはroll_id 2に影響を与えないだけ1. roll_id更新誰もが、私はroll_id 2を更新することができますどのようにお勧めすることはできますか?私はroll_idの代わりに実行する必要がありますか?

UPDATE employee_data 
    SET xml_data = 
      UPDATEXML (xml_data 
        ,'/root/xmldata/empid/text()' 
        ,'111') 
WHERE  roll_id IN (1,2) 

答えて

1

xpathからtext()を削除します。

.../empid/text() - あなたはテキストノードを持つempidを探しています。 .../empid` - あなたはempidを探しています。

UPDATE employee_data 
    SET xml_data = 
      UPDATEXML (xml_data 
        ,'/root/xmldata/empid' 
        ,'111') 
WHERE  roll_id IN (1,2) 

注意。 updatexmlおよびその他のxml変更メソッドは、Oracle 11.2から廃止されました。あなたは使うべきです。

update employee_data 
    set xml_data = xmlquery('copy $d := . 
     modify ( 
     for $i in $d/root/xmldata/empid 
     return (   
      replace value of node $i with "111" 
     ) 
     ) 
     return $d' passing xml_data returning content) where roll_id IN (1,2) 
+0

パラメータに111の値を渡すにはどうすればよいですか?たとえば、コードで111の代わりに入力パラメータとしてP_IDを指定したいとします。 :return( ノード$ iの値を "{@P_ID}"に置き換えます ) – user1630575

+0

私は最初の方法を試しました。それはempidノード全体をクリアするだけです。私はストアドプロシージャを介して値を渡すので、パラメータとして111を渡すことができる方法はありますか? – user1630575

+0

'xml_docを" doc "、111を" id "として渡し、' 'copy $ d:=を置き換えます。ノード$ iの値を "111"に置き換えます ' - >'ノード$ iの値を$ idに置き換えます ' –