[英]ORACLE - Update multiple attribute in xml
我有这种情况
create table FOO (
BAR clob
);
create table FOO2 (
VALUE_OLD varchar2(255),
VALUE_NEW varchar2(255)
);
insert into FOO2 values (1, 10);
insert into FOO2 values (2, 20);
insert into FOO2 values (3, 30);
insert into FOO (BAR) values (
'<xml>
<ope cod_ope="123" cod_sogg="1"/>
<ope cod_ope="456" cod_sogg="2"/>
<ope cod_ope="789" cod_sogg="3"/>
</xml>'
);
我需要用表 FOO2 中的 value_new 更新每个 ope 标签中的属性 cod_sogg (注意 ope 标签的数量是未知的,可能有 100 个 ope 标签)所以 xml 结果应该是
<xml>
<ope cod_ope="123" cod_sogg="10"/>
<ope cod_ope="456" cod_sogg="20"/>
<ope cod_ope="789" cod_sogg="30"/>
</xml>
我尝试过类似的东西
update FOO set BAR = UPDATEXML(
xmltype(BAR),
'/xml/ope/@cod_sogg',
(
select VALUE_NEW from FOO2 where value_old = extractvalue(xmltype(BAR), '/xml/ope/@cod_sogg')
)
).getClobVal();
但显然我明白了
Errore SQL: ORA-19025: EXTRACTVALUE restituisce il valore di un solo nodo
19025. 00000 - "EXTRACTVALUE returns value of only one node"
*Cause: Given XPath points to more than one node.
*Action: Rewrite the query so that exactly one node is returned.
我怎样才能做到这一点? 谢谢
您可以使用匿名块来执行此操作。
BEGIN
FOR I IN (SELECT VALUE_OLD, VALUE_NEW FROM FOO2)
LOOP
UPDATE FOO
SET BAR=to_clob(updatexml( xmltype.createxml(BAR),
'/xml/ope[@cod_sogg="' || I.VALUE_OLD || '"]/@cod_sogg',I.VALUE_NEW));
END LOOP;
END;
/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.