业务场景

本博客记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的。不过这个函数使用要谨慎,底层实现应该也是group by等等实现的,性能并不是特别好。这个函数在Oracle12是没有的,在Oracle11是不太兼容的,Oracle10可以正常使用。最近遇到这个问题,网上博客很多都写到了自定义列转行函数的办法去解决。但是这种办法并不一定适用所有的业务场景。我并没有采用。不过有些场景还是可以使用的。

网上优秀例子

下面是网络记录比较详细的例子

https://www.cnblogs.com/hanzongze/p/oracle-wm_concat.html

解决方案

通过自定义函数解决也是可以的,不过我并不是这样做的。

下面介绍一下我的解决方法。首先分析一下,Oracle11不兼容vm_concat列转行函数,并不代表其它函数不兼容,或许可以找到其它代替的,通过找资料,发现了Oracle11提供的另外一个函数:listagg()函数

语法:listagg(参数,'分隔符') within group(order by 参数id)

列子:to_char(listagg(ur.user_role,',' ) within GROUP (order by (ur.user_role))) userrole,

原来SQL:

select u.user_sex,
u.full_name,
u.user_code,
to_char(wm_concat(ur.user_role)) userrole,
to_char(wm_concat(r.role_name)) rolename,
to_char(r.role_type) roletype,
u.status
from t_user u
left outer join t_user_role ur
on ur.user_code = u.user_code
left outer join t_role r
on r.user_role = ur.user_role

首先通过SQL获取一下oracle版本号

<!-- 获取oracle版本信息 -->
<select id="getOracleVersion" resultType="string">
SELECT * FROM v$version WHERE banner LIKE 'Oracle%'
</select>

下面代码仅供参考,就是获取oracle版本号,然后传到mybatis的xml文件

String oracleVersion = approveConfigDao.getOracleVersion();
//eg:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
String[] bannerArr = oracleVersion.split(" ");
oracleVersion = bannerArr[2];
LOG.info("oracle版本:"+oracleVersion);
map.put("oracleVersion", oracleVersion);

orm框架是用mybatis的,所以sql稍微改一下,oracle10调vm_concat,oralce11的调listagg函数

select u.user_sex,
u.full_name,
u.user_code,
<choose>
<when test="oracleVersion=='11g' or oracleVersion=='12g'">
to_char(listagg(ur.user_role,',' ) within GROUP (order by (ur.user_role))) userrole,
to_char(listagg(r.role_name,',' ) within GROUP (order by (r.role_name))) rolename,
</when>
<otherwise>
to_char(wm_concat(ur.user_role)) userrole ,
to_char(wm_concat(r.role_name)) rolename ,
</otherwise>
</choose>
to_char(r.role_type) roletype,
u.status
from t_user u
left outer join t_user_role ur
on ur.user_code = u.user_code
left outer join t_role r
on r.user_role = ur.user_role

Oracle列转行函数版本不兼容解决方案的更多相关文章

  1. Oracle列转行函数LISTAGG()

    --Oracle列转行函数LISTAGG() with tb_temp as( select 'China' 国家,'Wuhan' 城市 from dual union all select 'Chi ...

  2. Oracle列转行函数Listagg以及pivot查询示例

    简单的Oracle列转行函数Listagg示例: CREATE TABLE tbl_test (catalog VARCHAR(1),product VARCHAR(2),amount NUMBER) ...

  3. Oracle列转行函数使用

    一.业务场景 今天需要实现一个table,有一列的效果是:用户姓名A(账号a),用户姓名B(账号b)...这种格式.这就想到oracle的列转行函数vm_concat. 可以用类似这种格式wm_con ...

  4. Oracle 列转行函数 Listagg()

    这是最基础的用法: LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX) 例: select listagg(oeid,',') within GROUP (ord ...

  5. Oracle列转行 参数动态传入iBatis使用示例

    Oracle行转列 参数动态传入iBatis使用示例 最近做了一个需求,需要获取工作流数据的各个节点的渠道数量信息,各渠道的费用信息~ 之前的需求是只需要获取渠道数据,所以做了渠道兼容,每个渠道数量的 ...

  6. oracle中行转列、列转行函数

    多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str ...

  7. oracle列转行

    unpivot()函数需要Oracle版本大于等于11g --创建表 create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 in ...

  8. oracle 的列转行函数 listagg()

    当你的表X中有A,B两列,数据如下 A B a 1 a 2 a 3 b 1 b 2 b 3 想让数据以 a|1|2|3 , b|1|2|3 格式显示可使用listagg() 1.使用listagg() ...

  9. 转:Oracle的列转行函数:LISTAGG()

    先看示例代码: with temp as( select 'China' nation ,'Guangzhou' city from dual union all select 'China' nat ...

随机推荐

  1. 分析easyswoole3.0源码,服务启动为例(二)

    以下内容需要结合es的源码,不然可能会觉得跳跃.先描述下es启动的大致流程.es启动的时候注册异常处理函数以及加载配置文件.根据位置文件的设置选择启动哪种swoole服务.然后用一个事件注册类,注册s ...

  2. web自动化上传附件 2

    当我们进行某一项web自动化脚本编写时,有上传附件操作,点击附件直接打开了windows窗口,而有的点击添加附件打开一个小窗体,再点击‘浏览’才打开windows窗口, 中间多了这么一个小窗体的操作, ...

  3. python中的继承和多态

    继承 继承的表现方式: class Animal(): pass class Cat(Animal): #animal是cat的父类,也可以说是基类 pass print(Cat.__bases__) ...

  4. 【转】为什么分布式一定要有Redis?

    发现一篇好文. https://studygolang.com/articles/15064

  5. EasyPR源码剖析(3):车牌定位之颜色定位

    一.简介 对车牌颜色进行识别,可能大部分人首先想到的是RGB模型, 但是此处RGB模型有一定的局限性,譬如蓝色,其值是255,还需要另外两个分量都为0,不然很有可能你得到的值是白色.黄色更麻烦,它是由 ...

  6. 七、PyQT5控件——QSlider,QSpinBox

    一.Qslider QSlider是一个滑动条,可以设置成水平或垂直放置.最常用的方法允许用户在某一范围内互动该滑块,并将滑块的位置转换成一个整数值(int类型),这种方式可以在某一个范围内平顺的变动 ...

  7. 分享一个14年写的用户管理类-swift版

    AccountManager类 14年设计,从swift 0.9开始,迭代到现在swift4.0版本,总体几乎没什么改动,简单稳定. 其实现的思路主要还是借助之前net反射的经验,实现了自动保存用户信 ...

  8. Vmware Workstation实现CentOS6.10_x64 下ORACLE RAC 11.2.0.4的搭建

    想必大家在学习ORACLE 11g时,都想搭建一个RAC的实验环境.在搭建RAC实验环境时,会碰到诸如IP怎么规划.虚拟机环境下怎么共享磁盘.ASM磁盘创建,以及安装过程中会遇到这样那样的问题.搭建一 ...

  9. day33 锁和队列

    队列 #put 和  get #__author : 'liuyang' #date : 2019/4/16 0016 上午 11:32 # 多进程之间的数据是隔离的 # 进程之间的数据交互 # 是可 ...

  10. 初入TensorFlow————配置TensorFlow

    能看到这说明你对python已经有一定的了解了,因此很多基础直接跳过. 一.TensorFlow环境配置: TensorFlow的环境配置在网上很多的教程都是用anaconda的方式,但是很容易出现冲 ...