2016-09-08 2 views

답변

0

체크 UPDATEXML의 orace 기능 (https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions205.htm)

with xml as (select '<?xml version="1.0" encoding="WINDOWS-1252"?> 
<View> 
    <ReportValues> 
     <SalaryValue variable="HR" value="999"/> 
     <SalaryValue variable="floor" value="20"/> 
    </ReportValues> 
</View>' xml from dual) 

select updatexml(xmltype.createxml(xml.xml),'/View/ReportValues/SalaryValue[@variable="HR"]/@value','666' ) 
    from xml 

이 창에서 변수 값 :

그것은 다음과 같이 보일 수 있습니다 "바닥"변수에 대한 617,451,515,
<?xml version="1.0" encoding="WINDOWS-1252"?> 
    <View> 
    <ReportValues> 
     <SalaryValue variable="HR" value="666"/> 
     <SalaryValue variable="floor" value="20"/> 
    </ReportValues> 
    </View> 

: @의 대답은 Анатолий Предеин가 10g 및 11g에 확실히 올바른 동안

select updatexml(x,'/View/ReportValues/SalaryValue[@variable="floor"]/@variable','SALES' ) 
    from (
select updatexml(xmltype.createxml(xml.xml),'/View/ReportValues/SalaryValue[@variable="HR"]/@value','666' ) x 
    from xml) 
0

하나는 updatexmldeprecated in Oracle 12c을하고있다 있음을 인식 할 필요가있다.

12cR1 이후로 XML을 조작하는 데 권장되는 방법은 XQuery Update Facility입니다. 그것은 오라클에 특화된 것은 아니지만 W3C 권고안은 다른 많은 XML 도구들도 구현했습니다.

아래에서 완벽한 예를 찾을 수 있습니다. 그러나 나는 XQuery에의 세부 사항에 들어가 대신 다음과 같은 문서를 가리 키지 않습니다

예 설정

에서
create table so61_t(
id number 
,xml xmltype 
); 

insert into so61_t values(1, '<?xml version="1.0" encoding="WINDOWS-1252"?> 
<View> 
    <ReportValues> 
     <SalaryValue variable="HR" value="999"/> 
     <SalaryValue variable="floor" value="20"/> 
    </ReportValues> 
</View>'); 

insert into so61_t values(2, '<?xml version="1.0" encoding="WINDOWS-1252"?> 
<View> 
    <ReportValues> 
     <SalaryValue variable="HR" value="998"/> 
     <SalaryValue variable="floor" value="19"/> 
    </ReportValues> 
</View>'); 

수정 XML

update so61_t set xml = 
xmlquery(
'copy $t := $x modify(
    (for $i in $t/View/ReportValues/SalaryValue[@variable="HR"]/@value 
    return replace value of node $i with ''666'') 
,(for $i in $t/View/ReportValues/SalaryValue[@variable="floor"]/@value 
    return replace value of node $i with ''SALES'') 
) return $t' 
passing xml as "x" returning content 
) 
where id = 1 
; 

결과

SQL> col id for 99 
SQL> col xml for a78 
SQL> select id, xmlserialize(content xml as varchar2(200)) as xml from so61_t; 
ID XML 
--- ------------------------------------------------- 
    1 <?xml version="1.0" encoding="UTF-8"?> 
    <View> 
     <ReportValues> 
     <SalaryValue variable="HR" value="666"/> 
     <SalaryValue variable="floor" value="SALES"/> 
     </ReportValues> 
    </View> 
    2 <?xml version="1.0" encoding="UTF-8"?> 
    <View> 
     <ReportValues> 
     <SalaryValue variable="HR" value="998"/> 
     <SalaryValue variable="floor" value="19"/> 
     </ReportValues> 
    </View> 

SQL> 
+0

여러분 모두 감사합니다. 위에 제공된 솔루션 중 하나를 사용했습니다. – user3588480

관련 문제