Я пытаюсь выполнить хранимую процедуру из Spring Batch, хранимая процедура имеет два параметра: параметр IN и параметр OUT. Я хочу получить набор результатов и параметр out при вызове хранимой процедуры.
Я ссылался на StoredProcedureItemReader и StoredProcedureItemReaderBuilder
Я могу использовать это для вызова хранимой процедуры, которая имеет только параметр IN, однако я не могу вызвать ее после регистрации параметра OUT.
Если мы ссылаемся на необработанный шаблон JDBC, который мы могли бы использовать, можно вызвать процедуру сохранения с переменными IN и OUT, используя https://docs.oracle.com/javase/7/docs/api/java/sql./CallableStatement.html
И я считаю, что StoredProcedureItemReader
или StoredProcedureIteamReaderBuilder
используют CallableStatement
за кулисами.
Мой вопрос: как зарегистрировать параметры OUT для выполнения в Spring Batch, используя StoredProcedureItemReaderBuilder
Вот пример кода, который я пробовал
@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 ;