spring-boot - 使用 Spring Batch 中的 IN 和 OUT 参数调用存储过程
问题描述
我正在尝试从 Spring Batch 执行存储过程,该存储过程有两个参数,一个 IN 参数和一个 OUT 参数。我想要的是在调用存储过程时获取结果集和 out 参数。
我提到了StoredProcedureItemReader和StoredProcedureItemReaderBuilder
我可以使用它来调用只有 IN 参数的存储过程,但是,我在注册 OUT 参数后无法调用。
如果我们引用我们可以使用的原始 JDBC 模板,则可以使用https://docs.oracle.com/javase/7/docs/api/java/sql/CallableStatement.html调用具有 IN 和 OUT 变量的存储过程
我相信StoredProcedureItemReader
还是在幕后StoredProcedureIteamReaderBuilder
使用。CallableStatement
我的问题是,如何使用StoredProcedureItemReaderBuilder注册 OUT 参数以在 Spring Batch 中执行
这是我尝试过的示例代码
@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 ;
解决方案
我的问题是,如何使用 StoredProcedureItemReaderBuilder 注册 OUT 参数以在 Spring Batch 中执行
那是不可能的。此功能已被请求但被拒绝。请在https://github.com/spring-projects/spring-batch/issues/2024中找到更多详细信息。
推荐阅读
- java - 骆驼sql存储的java,无法输入数组作为oracle存储过程的输入参数
- java - 如何使用处理在单独的线程中读取 OpenGL 像素?
- migration - 如何从主应用程序运行另一个应用程序的迁移
- php - 试图过滤品牌名称但它不起作用
- python-3.x - 您可以删除一个随机的逗号字符串并替换为一个以导出到 CSV
- javascript - 舍入函数给出不同的结果
- python - 获取 JSON 文件的语法错误
- c# - 如何使用 AutoMapper 将从 ForMember() 中的函数调用获得的值传递给另一个值
- python - NumPy 的字符串数组的内存使用量远大于对象数组
- javascript - 什么是用于识别 git-secret 存储库中 AWS 基本身份验证值的正则表达式?