首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Spring批处理的输入和输出参数调用存储过程

使用Spring批处理的输入和输出参数调用存储过程
EN

Stack Overflow用户
提问于 2020-06-04 04:53:38
回答 1查看 1.8K关注 0票数 0

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

我指的是StoredProcedureItemReaderStoredProcedureItemReaderBuilder

我可以使用它来调用只有IN参数的存储过程,但是在注册OUT参数之后,我不能调用。

如果我们引用我们可以使用的原始JDBC模板,就可以使用https://docs.oracle.com/javase/7/docs/api/java/sql/CallableStatement.html调用一个包含输入和输出变量的存储过程

我相信StoredProcedureItemReaderStoredProcedureIteamReaderBuilder在幕后使用CallableStatement

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

这是我试过的一个示例代码

代码语言:javascript
复制
@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();
    }

给出了以下错误:

代码语言:javascript
复制
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]

以下存储过程被调用

代码语言:javascript
复制
DELIMITER $$

CREATE PROCEDURE GetNameCountByFname(
    IN  fname VARCHAR(25),
    OUT total INT
)
BEGIN
    SELECT COUNT(*)
    INTO total
    FROM `first`
    WHERE `name` = fname;
END$$

DELIMITER ;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-04 10:17:06

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62187086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档