使用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
相关产品推荐
相关产品推荐

