2017-12-13 12 views
0

Russの勤務先を21から22に更新する必要がありますが、条件に基づいて更新するノードに到達できるコードを見つけることができません。XML内の複数のノードから1つだけを更新する

私が抽出しても、それは私に最初のノードのデータだけを与えます。

SELECT EXTRACT(XMLDATA, 'root/Level1Users/employeeinfo/username') 
    FROM TblUser_DATA -- gives only first username 

SELECT EXTRACT(XMLDATA, 'root/Level1Users/employeeinfo/username/text()') 
     FROM TblUser_DATA -- returns concatenated usernames in single row 

任意のポインタ?それが仕事だどのように

<root> 
    <Level1Users> 
    <isTrue>false</isTrue> 
    <employeeinfo> 
    <username>Tissy</username> 
    <role>RES</role> 
    <daysworked>20</daysworked> 
    <availability/> 
    </employeeinfo> 
    <employeeinfo> 
    <username>Russ</username> 
    <role>PES</role> 
    <daysworked>21</daysworked> 
    <availability>Yes</availability> 
    </employeeinfo> 
    <employeeinfo> 
    <username>Amy</username> 
    <role>PES</role> 
    <daysworked>22</daysworked> 
    <availability>Yes</availability> 
    </employeeinfo> 
    <by>ABC</by> 
    <date>13-JUN-2017</date> 
    </Level1Users> 
</root> 

答えて

1
with abc as (select xmltype('<root> 
    <Level1Users> 
    <isTrue>false</isTrue> 
    <employeeinfo> 
    <username>Tissy</username> 
    <role>RES</role> 
    <daysworked>20</daysworked> 
    <availability/> 
    </employeeinfo> 
    <employeeinfo> 
    <username>Russ</username> 
    <role>PES</role> 
    <daysworked>21</daysworked> 
    <availability>Yes</availability> 
    </employeeinfo> 
    <employeeinfo> 
    <username>Amy</username> 
    <role>PES</role> 
    <daysworked>22</daysworked> 
    <availability>Yes</availability> 
    </employeeinfo> 
    <by>ABC</by> 
    <date>13-JUN-2017</date> 
    </Level1Users> 
</root>') xml_ from dual) 
select 
      xmlquery('copy $doc :=. modify 
       (for $i in $doc/root/Level1Users/employeeinfo 
       where $i/username/text() eq "Russ" 
       return replace value of node $i/daysworked with "22") 
       return $doc' 
          passing xml_ returning content) 

Xmlquery('xquery statement' passing {list of passed element } returning content) - 変数$docにフル$input_documentをコピー - >関数はxmltype

copy $doc :=. modifyを返します。 (input_docuemntのコピーのみを変更することができます) (for ... return)これは 'flwor式' f - for、l-let、w-where、o-orderです。
表現手段を意味します。各employeeinfoの場合employeeinfo/username/test() = 'Russ'ノードのreplacaの値がemployeeinfo/daysworked with '22'で、return $doc以外の新しいxml文書を返します。

更新するには、更新ステートメントでxmlqueryを利用する必要があります。

Update table set xml_column := xmlquery('xquery' passing xml_column returning content) 
関連する問題