【问题标题】:Calling stored procedure with an IN and OUT Parameter from Spring Batch使用 Spring Batch 中的 IN 和 OUT 参数调用存储过程
【发布时间】:2020-09-22 23:49:06
【问题描述】:

我正在尝试从 Spring Batch 执行一个存储过程,该存储过程有两个参数,一个 IN 参数和一个 OUT 参数。我想要的是在调用存储过程时得到结果集和out参数。

我提到了StoredProcedureItemReaderStoredProcedureItemReaderBuilder

我可以用它来调用一个只有IN参数的存储过程,但是注册了OUT参数后就不能调用了。

如果我们引用我们可以使用的原始 JDBC 模板,则可以使用 https://docs.oracle.com/javase/7/docs/api/java/sql/CallableStatement.html 调用具有 IN 和 OUT 变量的存储过程

而且我相信StoredProcedureItemReaderStoredProcedureIteamReaderBuilder 在幕后使用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 ;

【问题讨论】:

  • 您好 Saad,欢迎来到 SO,您是否尝试过深入了解您在哪里得到了 arrayIndex 越界异常
  • @AshishShetkar 感谢您的欢迎。是的,我做到了。正在设置一个我无法控制的参数索引,导致它为-1。 Mahmoud 的回答告诉我,这种方法是不可能的。因此,现在我想实现一个 ItemReader,我将使用普通的旧 JDBC 调用显式调用 SP。

标签: spring-boot spring-batch java-stored-procedures


【解决方案1】:

我的问题是,如何使用 StoredProcedureItemReaderBuilder 注册 OUT 参数以在 Spring Batch 中执行

这是不可能的。此功能已被请求但被拒绝。请在https://github.com/spring-projects/spring-batch/issues/2024中找到更多详细信息。

【讨论】:

  • 感谢您的回答。在这种情况下,我是否应该实现一个 ItemReader,它显式地从具有 In 和 Out 变量的存储过程中读取?
  • 是的,您需要一个自定义阅读器。如果有帮助请采纳答案:stackoverflow.com/help/someone-answers
猜你喜欢
  • 2012-04-18
  • 2021-05-18
  • 2018-09-19
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
相关资源
最近更新 更多