临近年关,咱们给全公司用的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,极其容易被误导。