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

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

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

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

官方例子:

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传入之后会报错。于是又来了一种动态写法:

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,而且里面放置的是xml

a37c5bb5d9b1ab38e5e4a5475ef85e52de0.jpg

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

e48539d68e701333ec38923fe3a1be5a5b5.jpg

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

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

把select * 干掉,换成自己的字段输出:

090c7f1887d305cbb87809c59e327674de4.jpg

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

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

转载于:https://my.oschina.net/forever9999/blog/2986344

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值