Oracle使用XQuery关联XML表与标签映射表实现重映射问题咨询
Oracle XML标签重映射解决方案
需求概述
现有两张Oracle表:
- Table1:包含未格式化的XML片段字段
MY_XML - Table2:存储标签映射规则,字段
XML_TAG_NAME为原标签名,XML_NEW_TAG_NAME为重命名后的新标签名,存在空值条目
需要将Table1中匹配Table2非空映射规则的标签替换为新标签,忽略未匹配的标签和Table2中的空值行。
示例数据
Table1
| MY_XML |
|---|
<TAG1>1</TAG1><TAG2>2</TAG2><TAG3>3</TAG3> |
Table2
| XML_TAG_NAME | XML_NEW_TAG_NAME |
|---|---|
| TAG1 | NEW_TAG1 |
| null | null |
| TAG3 | NEW_TAG3 |
期望结果
<NEW_TAG1>1</NEW_TAG1><NEW_TAG3>3</NEW_TAG3>
解决方案SQL
以下SQL通过XMLTable拆解Table1的XML标签,关联过滤后的Table2映射规则,重命名标签后拼接结果:
SELECT -- 拼接重命名后的标签为字符串 RTRIM( XMLAGG( XMLELEMENT(e, XMLQuery( 'copy $t := $tag modify rename node $tag as $new_name return $t' PASSING xt.tag AS "tag", t2.XML_NEW_TAG_NAME AS "new_name" RETURNING CONTENT ) ).EXTRACT('/*') ).GETCLOBVAL(), '<>' ) AS transformed_xml FROM Table1 t, -- 拆解Table1的XML为单个标签(先包裹根节点保证XML合法性) XMLTable( '//*' PASSING XMLTYPE('<ROOT>' || t.MY_XML || '</ROOT>') COLUMNS tag XMLTYPE PATH '.' ) xt, -- 过滤Table2中的空值行 (SELECT XML_TAG_NAME, XML_NEW_TAG_NAME FROM Table2 WHERE XML_TAG_NAME IS NOT NULL AND XML_NEW_TAG_NAME IS NOT NULL) t2 -- 匹配原标签名 WHERE localname(xt.tag) = t2.XML_TAG_NAME;
代码说明
- XMLTable拆解XML:给Table1的XML片段包裹
<ROOT>根节点,保证XML合法性,再通过XMLTable将每个标签拆解为单独的行 - 过滤映射规则:子查询过滤Table2中
XML_TAG_NAME和XML_NEW_TAG_NAME均非空的行,排除无效映射 - 标签重命名:使用
XMLQuery的copy-modify语法对匹配的标签进行重命名 - 拼接结果:通过
XMLAGG将重命名后的标签拼接为最终的XML字符串
原代码问题分析
你之前尝试的代码存在以下问题:
- 使用
fn:collection读取Table2需要额外配置Oracle XML DB资源,且未关联标签名匹配逻辑 - 未过滤Table2中的空值条目
- 未实现标签重命名的核心逻辑,仅返回了Table2的行数据
内容的提问来源于stack exchange,提问作者user1283565
相关产品推荐
相关产品推荐

