JAVA中ORA-56900: pivot|unpivot 操作内不支持绑定变量

  • ORA-56900: pivot|unpivot 操作内不支持绑定变量
    • 使用场景及遇到问题
    • 解决方法:在java中拼好sql再执行
    • 实现效果

ORA-56900: pivot|unpivot 操作内不支持绑定变量

问题说明:oracle在使用行专列函数(pivot|unpivot),不允许pivot函数内动态绑定参数,即不支持:select * from table pivot(sum(column) for c1 in (?,?)) 这种写法。

使用场景及遇到问题

由于报表需求需要统计一年的数据:年份是由客户选的,会动态变


实际数据如上,会有指定的月份数据为空,由于觉得java去处理麻烦,就用oracle行转列行数补充日期为空的数据

理想状态:

实现方式

select * from (select count(*) sumNum,to_char(appl_time,'yyyy-MM') dateStr from OPM_CIM_ANALYSIS_RESULT t0where ADMITTANCEACCESS in ('Y','N') and appl_time is not nullgroup by to_char(appl_time,'yyyy-MM') order by to_char(appl_time,'yyyy-MM')  desc) pivot (sum(sumNum) for dateStr in<foreach collection="dateList" item="item" open="(" close=")" separator=",">#{item}</foreach>)

遇到问题:ORA-56900: pivot|unpivot 操作内不支持绑定变量

2021-06-21 10:22:07 | DEBUG | http-nio-7779-exec-1 | com.dfwy.cim.dao.mamagement.ManagerSumResultDao.querySurveyInfo | ==>  Preparing: select * from ( select count(*) sumNum,to_char(appl_time,'yyyy-MM') dateStr from OPM_CIM_ANALYSIS_RESULT t0 where ADMITTANCEACCESS in ('Y','N') and appl_time is not null group by to_char(appl_time,'yyyy-MM') order by to_char(appl_time,'yyyy-MM') desc ) pivot (sum(sumNum) for dateStr in ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) )
2021-06-21 10:22:07 | DEBUG | http-nio-7779-exec-1 | com.dfwy.cim.dao.mamagement.ManagerSumResultDao.querySurveyInfo | ==> Parameters: 2021-06(String), 2021-05(String), 2021-04(String), 2021-03(String), 2021-02(String), 2021-01(String), 2020-12(String), 2020-11(String), 2020-10(String), 2020-09(String), 2020-08(String), 2020-07(String)
2021-06-21 10:22:07 | ERROR | http-nio-7779-exec-1 | com.dfwy.frame.system.handler.GlobalExceptionHandler | 处理过程出现异常,Code:9000,message:
### Error querying database.  Cause: java.sql.SQLException: ORA-56900: pivot|unpivot 操作内不支持绑定变量

解决方法:在java中拼好sql再执行

本人觉得这方法很挫,有没有大佬有好办法,留个解决思路吧。
下面给出实现的伪代码

public ResponseResult querySurveyMonitor(JSONObject jsonObject) {Map<String,Object> paramMap = new HashMap<>(4);paramMap.put("bankId",bankId);paramMap.put("dateList",dateList);//日均调查次数String exeSql = dynamicSql("sumNum",paramMap);Map<String,BigDecimal> sumNum = sumResultDao.querySurveyInfo(exeSql);
}/*** 组装动态的行专列sql* @Author  pengdeyu* @Date   2021/6/21*/
private String dynamicSql(String name,Map<String,Object> paramMap){StringBuilder sb = new StringBuilder();sb.append("select * from (\n");sb.append("select count(*) "+name+",to_char(appl_time,'yyyy-MM') dateStr from OPM_CIM_ANALYSIS_RESULT t0\n");sb.append("where ADMITTANCEACCESS in ('Y','N') and appl_time is not null\n");String bankId = (String) paramMap.get("bankId");if(!Strings.isEmpty(bankId)){sb.append("and BANK_ID = #{bankId}\n");}sb.append("group by to_char(appl_time,'yyyy-MM') order by to_char(appl_time,'yyyy-MM')  desc\n");sb.append(") pivot (sum(sumNum) for dateStr in\n");List<String> dateList = (List<String>) paramMap.get("dateList");sb.append("(");for(int i=0;i<dateList.size();i++){sb.append("'"+dateList.get(i)+"'");if(i != dateList.size()-1){sb.append(",");}}sb.append("))");return sb.toString();}//dao接口方法 只有一个String类型参数 mapper中用${_parameter}取值
Map<String,BigDecimal> querySurveyInfo(String exeSql);//执行的Mapper配置文件
<select id="querySurveyInfo" parameterType="java.lang.String" resultType="java.util.Map">${_parameter}</select>

实现效果

JAVA异常记录(ORA-56900:pivot|unpivot 操作内不支持绑定变量)相关推荐

  1. Fundebug后端Java异常监控插件更新至0.2.0,支持Spring及Maven

    摘要: 0.2.0支持监控Spring应用,并且支持使用Maven接入插件,请大家及时更新. 支持监控Spring应用 1. pom.xml配置fundebug-spring依赖 <depend ...

  2. 异常记录: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError

    异常记录: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError 参考文章: (1)异常记录: Handle ...

  3. java抛出自定义异常_10 个深恶痛绝的 Java 异常。。

    异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题. 什么是异常及异常的分类请看这篇文章:一张图搞清楚 Java ...

  4. 10 个深恶痛绝的 Java 异常。。

    异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题. 什么是异常及异常的分类请看这篇文章:一张图搞清楚 Java ...

  5. java异常对象引用变量_Java面向对象编程-异常处理

    第九章 异常处理 异常情况会改变正常的流程,导致恶劣的后果,为了减少损失,应该事先充分预料所有可能出现的异常,然后采取以下措施: 首先考虑避免异常,彻底杜绝异常的发生:如果不能完全避免,则尽可能地减少 ...

  6. 10 个深恶痛绝的 Java 异常。。 1

    2019独角兽企业重金招聘Python工程师标准>>> 异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定 ...

  7. java 异常_Java 进阶之异常处理

    本文的主要内容分为 Java 异常的定义.Java 异常的处理.JVM 基础知识(异常表.JVM 指令分类和操作数栈)及深入剖析 try-catch-finally 四部分(图解形式).在深入剖析 t ...

  8. Java基础10:全面解读Java异常

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  9. 最最最全面的Java异常面试及解答

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | ThinkWon 来源 | blog.csdn ...

最新文章

  1. 第十六节:语法总结(3)(C#6.0和C#7.0新语法)
  2. 概要设计实例_尽可能通用的运维CMDB的设计与实践
  3. 以个人身份加入.NET基金会
  4. 小猴子蓝裤黄袄的局域网聊天
  5. Flutter ListView 下拉刷新与上拉加载更多
  6. Unity调用Android类方法
  7. java多线程-线程停止
  8. PHP-dede学习:common.ini.php文件
  9. ArcGIS API 离线字体库加载及跨域问题解决
  10. 2021年安全生产模拟考试(全国特种作业操作证电工作业-电力电缆模拟考试题库二)安考星
  11. oracle asm文件查找,Oracle ASM 文件管理
  12. VS2005水晶报表教程
  13. matlab在图像两点连线,matlab画图,画出任意两点间的连线图,请高人帮忙呀,谢谢!谢谢!...
  14. 用python画人物素描_python实现图片素描效果
  15. 王家林 大数据Spark超经典视频链接全集[转]
  16. 【火电机组、风能、储能】高比例风电电力系统储能运行及配置分析(Matlab代码实现)
  17. 【夜读】2022年最后10天,致自己!
  18. 星巴克——starbuck
  19. Linux入职基础-3.6_ramdisk提升Apache性能实例(运维必懂)
  20. 近似误差 与 估计误差

热门文章

  1. java怎么写合并列sql_SQL STUFF函数 拼接字符串 多列 合并成一列 转
  2. 计算机专业职业生涯规划书,计算机信息专业职业生涯规划书
  3. java基本类型val_Java的基本数据类型
  4. Java利用JNA调用C#的dll
  5. 解决“windows已经阻止此软件因为无法验证发行者”方法
  6. 细数Mac上那些好用且免费的软件(二)
  7. 整合一些我认知的几种编程语言
  8. 黑苹果OC配置工具:OpenCore Configurator for Mac(2.48.0.0中文)
  9. 【兴趣】日语(2021年3月24~)
  10. 餐饮SaaS行进时:美团To B,二维火To C