2017-12-13 21 views
0

Russ의 작업 일을 21에서 22로 업데이트해야하지만 조건에 따라 노드 만 업데이트 할 수있는 코드를 찾을 수 없습니다.XML의 여러 노드 중 하나를 업데이트하십시오.

추출해도 첫 번째 노드의 데이터 만 제공합니다.

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) for-l-let, w-where, o-order는 'flwor expression'f입니다.
표현의 의미. 각 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)