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

使用Camel调用Oracle存储过程报SQL92令牌不支持异常求助

解决Camel调用Oracle存储过程时的SQL92 Token不支持异常

嘿,我来帮你拆解这个问题——你碰到的java.sql.SQLException: Non supported SQL92 token错误,核心原因是Camel SQL组件默认的存储过程调用语法和Oracle的PL/SQL规范不兼容,而Derby刚好支持这种SQL92风格的调用,所以之前用内嵌Derby时一切正常。

为什么会触发这个异常?

Camel SQL组件默认采用SQL92标准的存储过程写法(比如直接写INOUTDEMO(...)),但Oracle数据库要求必须用BEGIN ... END;包裹的PL/SQL块来调用存储过程。Oracle的JDBC驱动在解析非PL/SQL格式的SQL时,会直接识别不了这种语法,提前抛出token不支持的异常,甚至没到检测存储过程是否存在的环节。

另外你定义的存储过程是Derby风格的(带PARAMETER STYLE JAVA),这在Oracle里也不适用,双重问题导致异常更早出现。

具体解决方案

1. 调整Camel路由的存储过程调用URI

把原来的sql-stored URI改成Oracle兼容的PL/SQL格式,用BEGIN ... END;包裹,同时正确绑定参数:

简化版(自动识别参数方向)

<to uri="sql-stored:BEGIN INOUTDEMO(?, ?, ?); END;?parameters=#in1,#in2,#out1"/>

明确参数方向版(更清晰可控)

如果需要指定每个参数的类型和方向,可以用Camel SQL的参数语法:

<to uri="sql-stored:BEGIN INOUTDEMO(:IN1, :IN2, :OUT1); END;?parameters=IN1:INTEGER:IN=headers.in1,IN2:INTEGER:INOUT=headers.in2,OUT1:INTEGER:OUT"/>

2. 修正Oracle存储过程的定义

你当前的存储过程是Derby专属格式,Oracle的存储过程语法应该改成这样:

CREATE OR REPLACE PROCEDURE INOUTDEMO(
    IN1 IN INTEGER,
    IN2 IN OUT INTEGER,
    OUT1 OUT INTEGER
) AS
BEGIN
    -- 替换成你的实际业务逻辑,比如给输出参数赋值示例
    IN2 := IN2 + 1;
    OUT1 := IN1 + IN2;
END;
/

3. 确认驱动与版本兼容性

你用的Camel 2.23.2和ojdbc7.jar本身是兼容的,但要注意:

  • ojdbc7.jar要匹配你的Oracle数据库版本(比如对应Oracle 12c)
  • 不要在项目中混入不同版本的Oracle JDBC驱动类,避免类冲突

补充小提示

Camel的sql-stored端点在不同数据库上的语法差异很大:

  • Derby支持SQL92标准的PROC_NAME(...)直接调用
  • Oracle必须用PL/SQL块包裹
  • MySQL则是用CALL PROC_NAME(...)格式

所以跨数据库迁移时,一定要针对性调整存储过程的调用语法哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:07:58