调用Oracle存储过程时JDBC丢失参数的问题排查
问题原因与解决方案
核心错误
你误用了withReturnValue()方法——这个方法是为Oracle函数(FUNCTION)设计的,函数本身会返回一个值,而你调用的是存储过程(PROCEDURE),存储过程没有返回值,只有定义的IN/OUT参数。添加withReturnValue()后,Spring会自动在调用语句中插入一个返回值占位符? = call ...,同时错误地减少了OUT参数的占位符数量,导致生成的调用语句{? = call MY_PROCEDURE(?)}只包含一个参数占位符,和存储过程需要的两个OUT参数不匹配,最终抛出语法错误。
修正后的代码
移除withReturnValue()配置即可,正确的SimpleJdbcCall代码如下:
SimpleJdbcCall simpleJdbcCall = simpleJdbcCallFactory.create() .withProcedureName("MY_PROCEDURE") .withoutProcedureColumnMetaDataAccess() .declareParameters(new SqlOutParameter("TAB1_CNT", Types.NUMERIC), new SqlOutParameter("TAB2_CNT", Types.NUMERIC)); simpleJdbcCall.execute();
额外注意点
检查你的存储过程定义,当前代码中PROCEDURE关键字后缺少存储过程名称(应该是create or replace NONEDITIONABLE PROCEDURE MY_PROCEDURE (),虽然你说SQL调用正常,但建议确认定义的正确性,避免后续其他问题。
内容的提问来源于stack exchange,提问作者Arli Chokoev
相关产品推荐
相关产品推荐

