Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle-XMLTYPE :Comment mettre à jour une valeur

Bien que la réponse de @Анатолий Предеин soit définitivement correcte pour 10g et 11g, il faut savoir que updatexml est obsolète dans Oracle 12c.

Depuis 12cR1, la méthode recommandée pour manipuler XML est XQuery Update Facility. Ce n'est pas spécifique à Oracle mais une recommandation du W3C a également implémenté de nombreux autres outils XML.

Vous trouverez ci-dessous un exemple complet. Cependant, je n'entre pas dans les détails de XQuery mais vous renvoie plutôt à la documentation suivante :

  • Mise à jour XQuery pour les impatients
  • Remplacement des nœuds XML du Guide du développeur Oracle XML DB

Exemple de configuration

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>');

Modifier 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
;

Résultats

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>