Mặc dù câu trả lời của @ Анатолий Предеин chắc chắn đúng cho 10g và 11g, một người cần lưu ý rằng updatexml
đã không được chấp nhận trong Oracle 12c.
Kể từ 12cR1, cách được khuyến nghị để thao tác với XML là Cơ sở Cập nhật XQuery. Nó không dành riêng cho Oracle nhưng Khuyến nghị W3C cũng đã triển khai nhiều công cụ XML khác.
Dưới đây bạn sẽ tìm thấy một ví dụ hoàn chỉnh. Tuy nhiên, tôi không đi vào chi tiết của XQuery mà chỉ bạn đến tài liệu sau:
- Cập nhật XQuery cho những người thiếu kiên nhẫn
- Thay thế các nút XML từ Hướng dẫn của nhà phát triển Oracle XML DB
Thiết lập mẫu
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>');
Sửa đổi 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
;
Kết quả
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>