Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle-XMLTYPE:Como atualizar um valor


Embora a resposta de @Анатолий Предеин esteja definitivamente correta para 10g e 11g, é preciso estar ciente de que updatexml foi preterido no Oracle 12c.

Desde 12cR1, a maneira recomendada de manipular XML é o XQuery Update Facility. Não é específico para Oracle, mas uma recomendação do W3C implementou muitas outras ferramentas XML também.

Abaixo você encontrará um exemplo completo. No entanto, não entro nos detalhes do XQuery, mas aponto para a seguinte documentação:
  • Atualização XQuery para impacientes
  • Substituindo nós XML do Guia do desenvolvedor do Oracle XML DB

Exemplo de configuração
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>