sql >> Database >  >> RDS >> Oracle

Oracle-XMLTYPE:een waarde bijwerken

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>


  1. SQL Server verbinden met een Java-database

  2. Bestanden uploaden en downloaden PHP en MySQL

  3. SQL Server-triggers:DML-triggers

  4. Divisie ( / ) geeft mijn antwoord niet in postgresql