oracle 11g下的行转列pivot填坑--xmlType转clob或String

临近年关,咱们给全公司用的API平台也到了要装逼的时刻,然而装逼利器还没搞完,那就是报表呈现,因而leader说你来搞一下吧。html

echarts确定是要的,报表呈现仍是很完美的。而后就是数据库层面的了。咱们装的是oracle 11g,这货提供了pivot来进行转列,然而它是有坑的,本次记录的就是这个。sql

pivot的定义很明确,https://www.oracle.com/technetwork/cn/articles/11g-pivot-101924-zhs.html 里面给出了一些例子。数据库

官方例子:mybatis

select * from (
   select times_purchased, state_code
   from customers t
)
pivot                         -----使用pivot声明
(
   count(state_code)          -----聚合函数,用于聚合数据
   for state_code             -----for后面跟的是须要行转成列的字段,能够多个,用括号包起来,逗号分隔
    in ('NY','CT','NJ','FL','MO') ------转列后固定的列名
)
order by times_purchased

这个是静态的写法,缺陷是行转列的列名必须写死,传入string字符串拼接都不行,mybatis传入以后会报错。因而又来了一种动态写法:oracle

select * from (
   select times_purchased as "Purchase Frequency", state_code
   from customers t
)
                               
pivot xml
(
   count(state_code)               
for state_code in (any)
)
order by 1

看着很完美对不对?用PL/SQL会告诉你,转换后的那一列是clob,并且里面放置的是xmlecharts

然而等你放到mybatis里,却发现不管如何都会报错,先让你加载一个xdb6的jar包,又让你加载xmlparserv2的jar,等你都加载完,又给你报错,说找不到binxml下的一个方法。你打开jar一开,果真没有,去oracle官网死活也找不到jar包,只能找到API。这时候就陷入了僵局,oracle这么坑的吗?官网上不是说是clob吗?dom

其实不是的,这货根本就是一个xmlType类型的数据,还没轮到mybatis懵逼,oracle本身的驱动就懵逼了。函数

这个时候你可能会想到oracle的xml解析函数,extractValue、extract之类,用了以后发现也不行。其实官网上没说的就是,类型转换。3d

把select * 干掉,换成本身的字段输出:code

重点是getstringval()或者是getclobval()转换方法,将字段内容转换成能够解析的格式,而后mybatis就能够解析了,也能够去掉xdb6/xmlparserv2这类jar包了,直接输出的就是xml,而后用dom4j进行解析转换。甚至能够作成一个注解,实现自动解析。

这个坑费了我好几个小时,其实仍是对oracle里的一些不经常使用的函数不熟致使的。网上大量的都是在plsql里写的sql,用mybatis这种在程序里编写的博客少,并且还有好多人告诉你,写死,写死,输出写死的sql,极其容易被误导。

相关文章
相关标签/搜索