巧用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 条评论
登录 后参与评论

相关文章

来自专栏鹅厂优文

Python 工匠:善用变量来改善代码质量

我一直觉得编程某种意义上是一门『手艺』,因为优雅而高效的代码,就如同完美的手工艺品一样让人赏心悦目。

7329
来自专栏Crossin的编程教室

每一个程序员要遵守的一些优秀编程风格

无论你是业余的还是专业的程序员,正确的编程风格,不但有助于提升软件产品的功能,还可以明显减少软件灾难的产生。今天,我们就来探讨一下有助于我们获取更佳编程风格的一...

3248
来自专栏北京马哥教育

我是这样挑战不用 for 循环的

学Python最简单的方法是什么?推荐阅读:Python开发工程师成长魔法 为什么要挑战自己在代码里不写for loop?因为这样可以迫使你去使用比较高级、地...

3308
来自专栏java一日一条

使用Java 8函数式编程生成字母序列

在 Java 8 中使用函数式编程生成字母序列是一个很大的挑战。Lukas Eder 愉快地接受了这个挑战,他将告诉我们如何使用 Java 8 来生成ABC的序...

312
来自专栏Java爬坑系列

【JAVA零基础入门系列】Day3 Java基本数据类型

  前两篇已经将开发环境搭建完成,如果你已经按之前的教程按部就班的完成了部署,那么世界上最优秀的编程语言之一和世界上最优秀的IDE之一已经出现在你的电脑上(此处...

1758
来自专栏CDA数据分析师

Excel简化办公系列之一 | VLOOKUP代替IF函数

本文为CDA作者青菜原创文章,转载请注明来源 编者按:CDA作者青菜将在近期发布「Excel简化办公」系列文章,本文是第一篇;更多精彩请持续关注~ 在日常工作...

2049
来自专栏编程之旅

《Clean Code》 读书小节(二)

之前在看了《Clean Code》这本书的前两章时,就写下了第一篇读书小节,而随着读书的深入,便决定再总结一下后面一部分的读书心得。

593
来自专栏斑斓

深入探索Scala的Option

程序员最深恶痛绝并力求避免的异常是NullPointerException,很不幸,我们往往又会忽略这个错误。不知是谁设计了Null这样的对象。我在文章《并非N...

3147
来自专栏司想君

即学即用系列一:纯函数

最近一直在思考如何通过文章或者培训快速提升团队的编码能力,总结下来其实技术的学习分为两类:一种是系统性的学习,比如学习一门语言,学习一个开发框架,这更需要自己从...

2617
来自专栏Albert陈凯

理解Scala的函数式风格:从var到val的转变

Scala允许你用指令式风格编程,但是鼓励你采用一种更函数式的风格。如果你是从指令式的背景转到Scala来的——例如,如果你是Java程序员——那么学习Scal...

2143

扫描关注云+社区