Während die Antwort von @Анатолий Предеин für 10g und 11g definitiv richtig ist, muss man sich bewusst sein, dass updatexml
ist in Oracle 12c veraltet.
Seit 12cR1 ist die empfohlene Methode zur Manipulation von XML XQuery Update Facility. Es ist nicht spezifisch für Oracle, aber eine W3C-Empfehlung hat auch viele andere XML-Tools implementiert.
Nachfolgend finden Sie ein vollständiges Beispiel. Ich gehe jedoch nicht auf die Details von XQuery ein, sondern verweise stattdessen auf die folgende Dokumentation:
- XQuery-Update für Ungeduldige
- Ersetzen von XML-Knoten aus dem Oracle XML DB Developer's Guide
Beispieleinrichtung
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 ändern
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
;
Ergebnisse
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>