巧用xmltype解析clob数据(r2笔记33天)

对于clob的数据,很多场合中都使用xml的格式,但是对于数据的查取和处理总是感觉力不从心。在条件允许的情况下,如果能够巧妙的使用xmltype来做数据处理,无意中是对于clob的一个处理利器。 简单说下需求。 数据库里存放的clob类似下面的格式 <ObjectInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Relations> <RelationInfo relationType="BackReference"> <RelatedObjects> <RelatedObjectInfo objID="##PC4.0##118146" /> <RelatedObjectInfo objID="##PC4.0##30369" /> <RelatedObjectInfo objID="##PC4.0##118145" /> <RelatedObjectInfo objID="##PC4.0##118211" /> <RelatedObjectInfo objID="##PC4.0##117696" /> <RelatedObjectInfo objID="##PC4.0##119094" /> <RelatedObjectInfo objID="##PC4.0##118203" /> <RelatedObjectInfo objID="##PC4.0##118133" /> <RelatedObjectInfo objID="##PC4.0##118135" /> <RelatedObjectInfo objID="##PC4.0##118583" /> <RelatedObjectInfo objID="##PC4.0##30313" /> <RelatedObjectInfo objID="##PC4.0##30310" /> <RelatedObjectInfo objID="##PC4.0##110154" /> <RelatedObjectInfo objID="##PC4.0##30317" /> <RelatedObjectInfo objID="##PC4.0##30314" /> <RelatedObjectInfo objID="##PC4.0##30315" /> <RelatedObjectInfo objID="##PC4.0##30318" /> <RelatedObjectInfo objID="##PC4.0##118131" /> <RelatedObjectInfo objID="##PC4.0##30309" /> <RelatedObjectInfo objID="##PC4.0##118160" /> <RelatedObjectInfo objID="##PC4.0##119101" /> </RelatedObjects> </RelationInfo> </Relations> </ObjectInfo> 现在有一个需求是能够把RelatedObjectInfo 中的objID查取,整理后得到一个以逗号分隔的串。 比如上面的clob数据,需要输出成为下面的形式: ##PC4.0##118146,##PC4.0##30369,##PC4.0##118145,##PC4.0##118211,##PC4.0##117696,##PC4.0##119094,##PC45.0##118203, 如果直接通过sql语句来写,确实很难实现,如果通过Pl/sql也需要做不少的工作。 下面尝试使用xmltype来直接读取clob数据。 简单创建一个测试表,插入数据。

create table AA(id number,c_cml clob); insert into aa values(5,to_clob(' <ObjectInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Relations> <RelationInfo relationType="BackReference"> <RelatedObjects> <RelatedObjectInfo objID="##PC4.0##118146" /> <RelatedObjectInfo objID="##PC4.0##30369" /> <RelatedObjectInfo objID="##PC4.0##118145" /> <RelatedObjectInfo objID="##PC4.0##118211" /> <RelatedObjectInfo objID="##PC4.0##117696" /> <RelatedObjectInfo objID="##PC4.0##119094" /> <RelatedObjectInfo objID="##PC4.0##118203" /> <RelatedObjectInfo objID="##PC4.0##118133" /> <RelatedObjectInfo objID="##PC4.0##118135" /> <RelatedObjectInfo objID="##PC4.0##118583" /> <RelatedObjectInfo objID="##PC4.0##30313" /> <RelatedObjectInfo objID="##PC4.0##30310" /> <RelatedObjectInfo objID="##PC4.0##110154" /> <RelatedObjectInfo objID="##PC4.0##30317" /> <RelatedObjectInfo objID="##PC4.0##30314" /> <RelatedObjectInfo objID="##PC4.0##30315" /> <RelatedObjectInfo objID="##PC4.0##30318" /> <RelatedObjectInfo objID="##PC4.0##118131" /> <RelatedObjectInfo objID="##PC4.0##30309" /> <RelatedObjectInfo objID="##PC4.0##118160" /> <RelatedObjectInfo objID="##PC4.0##119101" /> </RelatedObjects> </RelationInfo> </Relations> </ObjectInfo> ')); 来看看xmltype的效果,根据根节点,找到最终的叶子节点。 select extract(xmltype(c_cml),'/ObjectInfo/Relations/RelationInfo/RelatedObjects/RelatedObjectInfo') a, id from aa where id=5; A ID ---------------------------------------------------------------------------------------------------- -------- <RelatedObjectInfo objID="##PC4.0##118146"/><RelatedObjectInfo objID="##PC4.0##30369"/><RelatedObjec 5 tInfo objID="##PC4.0##118145"/><RelatedObjectInfo objID="##PC4.0##118211"/><RelatedObjectInfo objID= "##PC4.0##117696"/><RelatedObjectInfo objID="##PC4.0##119094"/><RelatedObjectInfo objID="##PC4.0##11 8203"/><RelatedObjectInfo objID="##PC4.0##118133"/><RelatedObjectInfo objID="##PC4.0##118135"/><Rela tedObjectInfo objID="##PC4.0##118583"/><RelatedObjectInfo objID="##PC4.0##30313"/><RelatedObjectInfo objID="##PC4.0##30310"/><RelatedObjectInfo objID="##PC4.0##110154"/><RelatedObjectInfo objID="##PC4 .0##30317"/><RelatedObjectInfo objID="##PC4.0##30314"/><RelatedObjectInfo objID="##PC4.0##30315"/><R elatedObjectInfo objID="##PC4.0##30318"/><RelatedObjectInfo objID="##PC4.0##118131"/><RelatedObjectI nfo objID="##PC4.0##30309"/><RelatedObjectInfo objID="##PC4.0##118160"/><RelatedObjectInfo objID="## PC4.0##119101"/> 可以看到已经查到了<RelatedObjectInfo>这部分的数据。 更进一步,把xml标记进行清除。可以直接使用replace SQL> select replace(extract(xmltype(c_cml),'/ObjectInfo/Relations/RelationInfo/RelatedObjects/RelatedObjectInfo'),'<RelatedObjectInfo objID="','') a, 2 id 3 from aa where id=5; A ID ---------------------------------------------------------------------------------------------------- -------- ##PC4.0##118146"/>##PC4.0##30369"/>##PC4.0##118145"/>##PC4.0##118211"/>##PC4.0##117696"/>##PC4.0##11 5 9094"/>##PC4.0##118203"/>##PC4.0##118133"/>##PC4.0##118135"/>##PC4.0##118583"/>##PC4.0##30313"/>##PC 4.0##30310"/>##PC4.0##110154"/>##PC4.0##30317"/>##PC4.0##30314"/>##PC4.0##30315"/>##PC4.0##30318"/># #PC4.0##118131"/>##PC4.0##30309"/>##PC4.0##118160"/>##PC4.0##119101"/> 然后直接清除尾部标记。 SQL> select replace(replace(extract(xmltype(c_cml),'/ObjectInfo/Relations/RelationInfo/RelatedObjects/RelatedObjectInfo'),'<RelatedObjectInfo objID="',''),'"/>',',') a, 2 id 3 from aa where id=5; A ID ---------------------------------------------------------------------------------------------------- -------- ##PC4.0##118146,##PC4.0##30369,##PC4.0##118145,##PC4.0##118211,##PC4.0##117696,##PC4.0##119094,##PC4 5 .0##118203,##PC4.0##118133,##PC4.0##118135,##PC4.0##118583,##PC4.0##30313,##PC4.0##30310,##PC4.0##11 0154,##PC4.0##30317,##PC4.0##30314,##PC4.0##30315,##PC4.0##30318,##PC4.0##118131,##PC4.0##30309,##PC 4.0##118160,##PC4.0##119101, 这样就能很快实现需求,把clob的数据当做xml来做处理,当然了对于clob的数据格式也是有一些限定的。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linxu shell指南

软件构件、中间件、面向对象

    1、构件定义:组(构)件是软件系统可替换的、物理的组成部分,它封装了实现体(实现某个职能)并提供了一组接口的实现方法。可以认为组件是一个封装的代码模块或...

1104
来自专栏云飞学编程

Python爬虫的简单实现!用python爬虫自己做天气预报查询

最近小编在学习爬虫,就想找个东西练练手,小说、图片、音乐什么的都烂大街了,正好最近天气是越来越冷,小编窝家里自己敲了个天气简单查询的代码,请大家指正下!

641
来自专栏coding for love

JS常用设计模式解析

我想作为一个前端开发者,前期大多数只会关注代码的功能性。但是随着编程经验的增加,维护更大更复杂的代码模块,需要的就不仅仅只是代码功能性的实现,还需要关注代码的复...

643
来自专栏Linyb极客之路

Redis作者谈如何编写系统软件的代码注释

顶顶大名的Redis作者谈如何在Redis这样系统软件上进行代码文档注释,以下是九种注释类型的大意说明: 很长一段时间以来,我一直想在YouTube上发布一段...

1296
来自专栏java思维导图

VO、DTO、DO、PO 我告诉你

导图下载请点击文章底左下角->阅读原文 概念: VO(View Object) 视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。 D...

4308
来自专栏机器学习和数学

[编程经验] Python之hello world!

今天面向的读者是之前没有接触过Python,现在想学习的童鞋。如果你是Python老鸟,可以点左上角的叉叉了。 主要分为以下三个...

2694
来自专栏方俊贤的专栏

微服务架构 : 提升微服务分布式远程调用的可靠性与性能 ( 四 )

在分布式微服务的架构下, 架构师往往面临著可靠性与性能间的抉择。 Circuit Breaker 提供了一个可同时兼顾可靠性与性能的解决方案。

2260
来自专栏无题

读《Effecttive Java》

“读完一本《Effecttive Java》,才算是一个中级Java程序员” 2019-09-15 “读完一本《Effecttive Java》,才算是一个中...

3595
来自专栏逍遥剑客的游戏开发

被FMOD的内存管理坑了一把

2442
来自专栏牛客网

c++后台开发实习面经 - 今日头条

4.tcp的三次握手四次挥手的全过程和状态,为什么要四次挥手,为什么要经过TIME WAIT状态

1003

扫码关注云+社区