sql >> Base de Datos >  >> RDS >> Oracle

Oracle-XMLTYPE:Cómo actualizar un valor

Si bien la respuesta de @Анатолий Предеин es definitivamente correcta para 10g y 11g, se debe tener en cuenta que updatexml ha quedado obsoleto en Oracle 12c.

Desde 12cR1, la forma recomendada de manipular XML es XQuery Update Facility. No es específico para Oracle, pero una recomendación del W3C también implementó muchas otras herramientas XML.

A continuación encontrará un ejemplo completo. Sin embargo, no entro en los detalles de XQuery, sino que le remito a la siguiente documentación:

  • Actualización de XQuery para los impacientes
  • Reemplazo de nodos XML de la Guía del desarrollador de base de datos XML de Oracle

Configuración de ejemplo

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

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

Resultados

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>