如何在运行时更新xml字段值?

时间:2017-10-26 13:42:27

标签: sql xml oracle plsql

我有以下xml。我想在运行时在Oracle PLSQL中将权重更新为XML中的2KG。怎么做?

    <XML><FRUIT_SHOP>AZHAGIRI</FRUIT_SHOP>
<FRUITS>
<FRUIT>
<FRUIT_NAME>ORANGE</FRUIT_NAME>
<ORANGE_FIELDS>
<FIELD>
<KEY>COLOUR</KEY>
<VALUE>LIGHT_RED</VALUE>
</FIELD>
<FIELD>
<KEY>WEIGHT</KEY>
<VALUE>1KG</VALUE>
</FIELD>
</DETAIL>
</ORANGE_FIELDS>
</FRUIT>
</FRUITS>

预期

<XML><FRUIT_SHOP>AZHAGIRI</FRUIT_SHOP>
<FRUITS>
<FRUIT>
<FRUIT_NAME>ORANGE</FRUIT_NAME>
<ORANGE_FIELDS>
<FIELD>
<KEY>COLOUR</KEY>
<VALUE>LIGHT_RED</VALUE>
</FIELD>
<FIELD>
<KEY>WEIGHT</KEY>
<VALUE>2KG</VALUE>
</FIELD>
</DETAIL>
</ORANGE_FIELDS>
</FRUIT>
</FRUITS>

Oracle plsql块应该这样做吗?

1 个答案:

答案 0 :(得分:1)

只需使用SQL:

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE table_name ( xml_column ) AS
SELECT XMLTYPE( '<XML>
<FRUIT_SHOP>AZHAGIRI</FRUIT_SHOP>
<FRUITS>
  <FRUIT>
    <FRUIT_NAME>ORANGE</FRUIT_NAME>
    <ORANGE_FIELDS>
      <FIELD><KEY>COLOUR</KEY><VALUE>LIGHT_RED</VALUE></FIELD>
      <FIELD><KEY>WEIGHT</KEY><VALUE>1KG</VALUE></FIELD>
    </ORANGE_FIELDS>
  </FRUIT>
</FRUITS>
</XML>' )
FROM DUAL;

UPDATE table_name
SET xml_column = UPDATEXML(
  xml_column,
  '/XML/FRUITS/FRUIT/ORANGE_FIELDS/FIELD/KEY[text()="WEIGHT"]/../VALUE/text()',
  '2KG'
);

查询1

SELECT t.xml_column.getClobVal()
FROM   table_name t

<强> Results

|                T.XML_COLUMN.GETCLOBVAL() |
|------------------------------------------|
| <XML>
  <FRUIT_SHOP>AZHAGIRI</FRUIT_SHOP>
  <FRUITS>
    <FRUIT>
      <FRUIT_NAME>ORANGE</FRUIT_NAME>
        <ORANGE_FIELDS>
        <FIELD>
          <KEY>COLOUR</KEY>
          <VALUE>LIGHT_RED</VALUE>
        </FIELD>
        <FIELD>
          <KEY>WEIGHT</KEY>
          <VALUE>2KG</VALUE>
        </FIELD>
      </ORANGE_FIELDS>
    </FRUIT>
  </FRUITS>
  </XML>