繁体   English   中英

ORACLE - 更新 xml 中的多个属性

[英]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;
/

db<>小提琴演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM