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,極其容易被誤導。

相關文章
相關標籤/搜索