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

Camel调用存储过程出现ORA-06502异常求助

生产环境Camel/Spring调用Oracle存储过程ORA-06502异常排查

问题背景

生产环境使用Camel/Spring框架对接Oracle时,某夜间定时任务出现异常。该任务正常运行3周后近期每晚失败,其他存储过程调用均正常。存储过程日志显示所有流程执行完成,结果计数和状态码符合预期,但中间件处理响应时抛出ORA-06502错误。

异常信息

org.springframework.jdbc.BadSqlGrammarException CallableStatementCallback; bad SQL grammar [{call someschmea.somepackagename.someprocedure(?, ?, ?)}]; nested exception is java.sql.SQLException: ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 1

调用代码

.to("sql-stored:someschema.somepackagename.someprocedure(" + 
    "OUT VARCHAR op_pending_list, OUT INTEGER op_return_status, OUT VARCHAR op_return_message)?dataSource=#somedatasource")

已排查方向

  • 返回值类型问题:考虑过Integer是否需改为Camel的NUMERIC类型,但该类型在其他存储过程中使用正常
  • 返回内容过大:op_pending_list返回内容约75K,中间件声明为VARCHAR,存储过程中对应CLOB类型,尝试改用CLOB调用失败
  • 存储过程日志写入后无剩余代码执行,但仍触发异常
  • 怀疑是否为Spring框架本身问题

解决思路

  1. 聚焦ORA-06502本质:该错误核心是数值/值类型不匹配或超出范围,结合存储过程已执行完成,问题大概率出在结果集返回时的类型映射或数据溢出,而非存储过程内部逻辑。
  2. 修复op_pending_list的类型适配:
    • Oracle的VARCHAR最大长度为4000字节,75K内容远超出限制,这是核心矛盾。之前改用CLOB调用失败,需检查参数配置:
      • 将Camel中的OUT VARCHAR改为OUT CLOB,同时明确指定类型映射:OUT CLOB op_pending_list=java.sql.CLOB
      • 若CLOB调用仍失败,可在存储过程中通过DBMS_LOB.SUBSTR分段返回数据,或在Camel端配置流式处理接收CLOB
  3. 排查生产环境触发数据:DEV/TEST环境正常,说明是特定生产数据触发异常。提取失败时op_pending_list的实际内容,重点检查是否存在多字节特殊字符、超长字段或编码差异导致实际字节数超出预期。
  4. 验证返回状态码范围:确认生产环境中op_return_status的返回值是否超出Java Integer的取值范围(Oracle NUMBER类型可存储远大于2^31-1的值),尝试改为Camel的NUMERIC类型测试。
  5. 检查JDBC组件配置:
    • 查看数据源连接属性,是否存在defaultRowPrefetch等影响大字段读取的配置,调整为合适的值
    • 确认Camel sql-stored组件版本,排查是否存在已知的大字段处理bug,必要时升级组件
  6. 存储过程返回阶段优化:在存储过程最后一步显式提交事务,或对CLOB返回字段做明确的类型转换后再返回,避免隐式操作导致的类型异常。

内容的提问来源于stack exchange,提问作者Gerry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:35:26