Hoewel het antwoord van @Анатолий Предеин zeker correct is voor 10g en 11g, moet men zich ervan bewust zijn dat updatexml
is verouderd in Oracle 12c.
Sinds 12cR1 is XQuery Update Facility de aanbevolen manier om XML te manipuleren. Het is niet specifiek voor Oracle, maar een W3C-aanbeveling heeft ook veel andere XML-tools geïmplementeerd.
Hieronder vind je een compleet voorbeeld. Ik ga echter niet in op de details van XQuery, maar wijs u in plaats daarvan op de volgende documentatie:
- XQuery-update voor de ongeduldige
- XML-knooppunten vervangen uit Oracle XML DB Developer's Guide
Voorbeeldconfiguratie
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 wijzigen
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
;
Resultaten
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>