You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:37:13