Вызов хранимой процедуры с параметрами IN и OUT из Spring Batch

Я пытаюсь выполнить хранимую процедуру из 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 ;

person Saad Yaseen    schedule 04.06.2020    source источник
comment
Привет Саад, добро пожаловать в SO, вы пытались развернуть, где вы получаете исключение arrayIndex из связанного исключения   -  person Ashish Shetkar    schedule 04.06.2020
comment
@AshishShetkar Спасибо за прием. Да, я сделал. Индекс параметра, который я не могу контролировать, был установлен, что привело к тому, что он был равен -1. Ответ Махмуда говорит, что с таким подходом я невозможен. Поэтому теперь я думаю реализовать ItemReader, где я буду явно вызывать SP, используя простые старые вызовы JDBC.   -  person Saad Yaseen    schedule 04.06.2020


Ответы (1)


Мой вопрос: как зарегистрировать параметры OUT для выполнения в Spring Batch с помощью StoredProcedureItemReaderBuilder

Это невозможно. Эта функция уже запрашивалась, но была отклонена. Дополнительные сведения см. на странице https://github.com/spring-projects/spring-batch/issues/2024.

person Mahmoud Ben Hassine    schedule 04.06.2020
comment
Спасибо за ответ. В таких случаях следует ли мне в качестве альтернативы реализовать ItemReader, который явно читает из хранимой процедуры с входными и выходными переменными? - person Saad Yaseen; 04.06.2020
comment
Да, вам нужен специальный ридер. Пожалуйста, примите ответ, если он помог: stackoverflow.com/help/someone-answers - person Mahmoud Ben Hassine; 04.06.2020