我试图从Spring执行一个存储过程,存储过程有两个参数,一个IN参数和OUT参数。我想要的是在调用存储过程时获得结果集和out参数。
我指的是StoredProcedureItemReader和StoredProcedureItemReaderBuilder
我可以使用它来调用只有IN参数的存储过程,但是在注册OUT参数之后,我不能调用。
如果我们引用我们可以使用的原始JDBC模板,就可以使用https://docs.oracle.com/javase/7/docs/api/java/sql/CallableStatement.html调用一个包含输入和输出变量的存储过程
我相信StoredProcedureItemReader或StoredProcedureIteamReaderBuilder在幕后使用CallableStatement。
我的问题是,如何使用StoredProcedureItemReaderBuilder注册参数以便在Spring中执行
这是我试过的一个示例代码
@StepScope
@Bean
public StoredProcedureItemReader<MyRow> rowReader(@Value("#{stepExecutionContext[tableName]}") String tableName) {
return new StoredProcedureItemReaderBuilder<MyRow>()
.procedureName("GetNameCountByFname")
.parameters(
new SqlParameter[]{
new SqlParameter("fname", Types.VARCHAR),
new SqlOutParameter("total", Types.INTEGER)
}).
preparedStatementSetter(
new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps)
throws SQLException {
ps.setString(1, "bob");
}
}
.rowMapper(new MyRowMapper(tableName))
.name(tableName + "_read")
.dataSource(dataSource)
.build();
}给出了以下错误:
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:422) ~[na:1.8.0_251]
at java.util.ArrayList.get(ArrayList.java:435) ~[na:1.8.0_251]
at com.mysql.cj.jdbc.CallableStatement$CallableStatementParamInfo.getParameter(CallableStatement.java:283) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.jdbc.CallableStatement.checkIsOutputParam(CallableStatement.java:634) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.jdbc.CallableStatement.getObject(CallableStatement.java:1356) ~[mysql-connector-java-8.0.20.jar:8.0.20]以下存储过程被调用
DELIMITER $$
CREATE PROCEDURE GetNameCountByFname(
IN fname VARCHAR(25),
OUT total INT
)
BEGIN
SELECT COUNT(*)
INTO total
FROM `first`
WHERE `name` = fname;
END$$
DELIMITER ;发布于 2020-06-04 10:17:06
我的问题是,如何使用StoredProcedureItemReaderBuilder注册参数以便在Spring中执行
这不可能。此功能已被请求,但被拒绝。请在https://github.com/spring-projects/spring-batch/issues/2024中找到更多细节。
https://stackoverflow.com/questions/62187086
复制相似问题