2016-09-08 46 views
0

我有一個Oracle表,在下面的格式存儲XML一個XMLType列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」,並且還從 「地板」 到 「SALES」

回答

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