oracle - Oracle xmltype 查询和更新
问题描述
我的 xmltype 字段值如下:
<c1>100</c1>
<c1 m=“2”>50</c1>
<c1 m=“3”>10</c1>
<c1 m=“4”>60</c1>
我的查询是显示大于 50 的节点并将值更新为 100。
解决方案
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<>在这里摆弄
推荐阅读
- scheme - 如何在andmap内部的lambda函数中返回一个值
- mysql - 如何创建两个不同 django 模型的联合?
- selenium - 如何在 Selenium 中定位具有 div 格式的元素。出现错误无法使用 xpath 表达式定位元素
- php - Wordpress 4.9 session_start 中的主题功能
- spring - 如何配置一个可以访问spring security中所有url的管理员角色
- php - PHP 7.2 升级代码 - REGEX 未定义常量的使用
- express - SocketIO 阻塞服务器
- python - 最有效的字符串缓冲
- dji-sdk - 这里有人让 DJI Windows SDK 工作了吗?
- sql - 添加 SQL EXIT HANDLER FOR SQLEXCEPTION 会导致语法错误和意外文本