Oracle使用EXTRACTVALUE函数解析XML
需求是将oracle数据库中将clob类型保存的xml文本在视图中解析传递给其他程序.
解析xml的方法有很多, 各种语言都有支持, 我曾试图通过java解析后再传递, 后来我发现oracle的extractvalue也可以实现, 在oracle数据库的视图中直接使用就可以了.
下面我先介绍extractvalue解析的两种方式.
XML节点中含属性
<AAA>
<BBB id = "b1"/>
<BBB id = "b2">
好转
</BBB>
<BBB name = "bbb"/>
<BBB/>
</AAA>
以上内容保存在表binglinr
中jilunr
字段, 其数据类型为clob
, 如果我需要取节点<BBB id = "b2">好转</BBB>
内的值, 只需以下的语句即可, 结果值为好转
SELECT extractvalue(XMLTYPE(b.jilunr),'/AAA/BBB[@id="b2"]') FROM binglinr B
XML节点中没有属性,且多个重复
<AAA>
<BBB>
治愈
</BBB>
<BBB>
好转
</BBB>
<BBB>
其他
</BBB>
</AAA>
如果要获取指定节点的值, 只需指定节点的序号即可, 比如我要获取好转
的值,
SELECT extractvalue(XMLTYPE(b.jilunr),'/AAA/BBB[2]') FROM binglinr B
终极方案 从Oracle官网说起
Oracle官网的说明EXTRACTVALUE
如上文sql语句中所写, 传入的第二个参数是xml
的xpath_string
, 实际中只要满足xml的xPath解析规则都可以实现节点内容的获取, 具体的解析规则, 可以参考这篇文章xml的xPath解析规则
注意事项
实际使用中, 不应直接在sql语句中使用, 最好写一个函数, 当extractvalue
解析出现异常情况(比如返回了多个节点)时以其他字符返回.