Spring Boot执行Oracle SUM查询时遇ORA-01722错误求助
问题分析与解决
核心原因
ORA-01722错误本质是字符串转数字失败。你提供的示例数据虽都是合法数字格式,但实际表中可能存在肉眼不可见的脏数据(比如空格、换行符、特殊符号),或是DBeaver与Oracle JDBC驱动对隐式转换的处理逻辑存在差异:
- DBeaver可能在执行查询时自动忽略/处理了转换失败的记录,或是使用的驱动版本、连接参数对隐式转换更宽松;
- Spring Boot中使用的JDBC驱动严格执行Oracle的类型转换规则,触发了错误。
另外注意:你Spring Boot代码中的表名写的是table,而DBeaver中用的是transfer_history,这大概率是笔误,需先确认表名是否正确。
解决方案
1. 排查并清理脏数据
执行以下SQL找出所有无法转换为数字的credit记录:
SELECT credit, ROWID FROM transfer_history WHERE NOT REGEXP_LIKE(credit, '^[0-9]+(\.[0-9]+)?$')
找到后直接清理这些脏数据(删除或修正为合法数字格式),再执行SUM查询即可。
2. 显式转换并处理转换失败(推荐)
如果无法清理数据,或是需要兼容脏数据,在SUM时显式转换并处理转换错误:
- Oracle 12c及以上版本,使用
TO_NUMBER的错误处理语法:
SELECT SUM(TO_NUMBER(credit DEFAULT 0 ON CONVERSION ERROR)) FROM transfer_history
- Oracle 11g及以下版本,用CASE配合正则判断:
SELECT SUM( CASE WHEN REGEXP_LIKE(credit, '^[0-9]+(\.[0-9]+)?$') THEN TO_NUMBER(credit) ELSE 0 END ) FROM transfer_history
3. 修正Spring Boot中的表名
确认@Query中的表名是否正确,将table改为实际表名transfer_history:
@Query(value = "SELECT SUM(TO_NUMBER(credit DEFAULT 0 ON CONVERSION ERROR)) FROM transfer_history", nativeQuery = true)
内容的提问来源于stack exchange,提问作者Ompusunggu
相关产品推荐
相关产品推荐

