首页 > 解决方案 > Oracle xmltype 查询和更新

问题描述

我的 xmltype 字段值如下:

<c1>100</c1>
<c1 m=“2”&gt;50</c1>
<c1 m=“3”&gt;10</c1>
<c1 m=“4”&gt;60</c1>

我的查询是显示大于 50 的节点并将值更新为 100。

标签: oraclexmltype

解决方案


UPDATE table_name
SET    column_name = UPDATEXML( column_name, '/c1/text()', 100 )
WHERE  EXTRACTVALUE( column_name, '/c1' ) > 50

对于您的测试数据:

CREATE TABLE table_name ( column_name ) AS
SELECT XMLTYPE( '<c1>100</c1>' ) FROM DUAL UNION ALL
SELECT XMLTYPE( '<c1 m="2">50</c1>' ) FROM DUAL UNION ALL
SELECT XMLTYPE( '<c1 m="3">10</c1>' ) FROM DUAL UNION ALL
SELECT XMLTYPE( '<c1 m="4">60</c1>' ) FROM DUAL

然后:

SELECT *
FROM   table_name;

输出:

| COLUMN_NAME |
| :--------------------- |
| <c1>100</c1><br> |
| <c1 m="2">50</c1><br> |
| <c1 m="3">10</c1><br> |
| <c1 m="4">100</c1><br> |

db<>在这里摆弄


如果您有多个c1元素包裹在根元素中,那么您可以使用以下XMLQUERY语句:

UPDATE table_name
SET    column_name = XMLQuery(
         'copy $i := $c modify
         (for $j in $i/row/c1 where $j > 50
           return replace value of node $j with 100)
         return $i'
         PASSING column_name AS "c"
         RETURNING CONTENT
       )
WHERE  XMLEXISTS( '/row[c1 > 50]' PASSING column_name )

因此,对于您的测试数据:

CREATE TABLE table_name ( column_name ) AS
SELECT XMLTYPE( '<row><c1>100</c1><c1 m="2">50</c1><c1 m="3">10</c1><c1 m="4">60</c1></row>' ) FROM DUAL UNION ALL
SELECT XMLTYPE( '<row><c1>10</c1></row>' ) FROM DUAL

这输出:

| COLUMN_NAME |
| :------------------------------------------------ -------------------------------------------------- -------- |
| <row><br> <c1>100</c1><br> <c1 m="2">50</c1><br> <c1 m="3">10</c1><br> <br> c1 m="4">100</c1><br></row><br> |
| <row><br> <c1>10</c1><br></row><br> |

db<>在这里摆弄


推荐阅读