2016-09-08 13 views
0

У меня есть таблица Oracle с колонкой XmlType, который хранит XML в следующем форматеOracle-XmlType: Как обновить значение

<?xml version="1.0" encoding="WINDOWS-1252"?> 
<View> 
    <ReportValues> 
     <SalaryValue variable="HR" value="999"/> 
     <SalaryValue variable="floor" value="20"/> 
    </ReportValues> 
</View> 

Я хотел бы знать, как обновить значение от 999 до 666 для переменная "HR", а также значение переменной от "пола" до "ПРОДАЖА"

ответ

0

проверка UPDATEXML orace функция (https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions205.htm)

with xml as (select '<?xml version="1.0" encoding="WINDOWS-1252"?> 
<View> 
    <ReportValues> 
     <SalaryValue variable="HR" value="999"/> 
     <SalaryValue variable="floor" value="20"/> 
    </ReportValues> 
</View>' xml from dual) 

select updatexml(xmltype.createxml(xml.xml),'/View/ReportValues/SalaryValue[@variable="HR"]/@value','666' ) 
    from xml 

возвращения этого:

<?xml version="1.0" encoding="WINDOWS-1252"?> 
    <View> 
    <ReportValues> 
     <SalaryValue variable="HR" value="666"/> 
     <SalaryValue variable="floor" value="20"/> 
    </ReportValues> 
    </View> 

для «пола» переменной может выглядеть следующим образом:

select updatexml(x,'/View/ReportValues/SalaryValue[@variable="floor"]/@variable','SALES' ) 
    from (
select updatexml(xmltype.createxml(xml.xml),'/View/ReportValues/SalaryValue[@variable="HR"]/@value','666' ) x 
    from xml) 
0

Хотя ответ @ Анатолий Предеин, безусловно, правильно для 10g и 11g один должен быть в курсе, что updatexml было deprecated in Oracle 12c.

С 12cR1 рекомендуемым способом управления XML является XQuery Update Facility. Это не относится к Oracle, но в Рекомендации W3C реализовано много других инструментов XML.

Ниже вы найдете полный пример. Однако я не вдаваться в детали XQuery, но вместо того, чтобы указать вам на следующей документации:

Пример установки

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

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 
; 

Результаты

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> 
+0

Спасибо вам всем. Я использовал одно из решений, указанных выше. – user3588480

 Смежные вопросы

  • Нет связанных вопросов^_^