Java Spring Batch StoredProcedureItemReader实现(SYSBASE IQ)

时间:2018-10-15 11:55:58

标签: java spring spring-batch

我正在实现春季批StoredProcedureItemReader结果集类型。当我通过JdbcTemplate调用过程时,它工作正常,但是当我使用StoredProcedureItemReader作为读取器时,这给我一个错误。我正在使用 SYBASE IQ作为数据库,存储过程的返回类型为结果集。

代码段:我对StoredProcedureItemReader Spring Batch etl的配置。方法有一个作业参数,我将其作为参数传递给过程(SYBASE IQ DB)。存储过程的返回类型是结果集一个带有多行的选择语句。

@Bean(destroyMethod="")
@StepScope
public StoredProcedureItemReader<TransactionReportingBean>  dataExtractReader(
    @Value("#{jobParameters[clientName]}") String clientName) throws Exception {

    StoredProcedureItemReader<TransactionReportingBean> 
    storedProcedureItemReader = new StoredProcedureItemReader<>();    
    storedProcedureItemReader.setDataSource(sybaseIqSource);

    storedProcedureItemReader.setProcedureName("getResult"); /**getClientPositionIBORData**/
    SqlParameter[] parameters = {new SqlParameter("ClientName", Types.VARCHAR)};
    storedProcedureItemReader.setParameters(parameters);

    storedProcedureItemReader.setPreparedStatementSetter(new PreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement arg0) throws SQLException {
            arg0.setString(1,clientName);
         }
        });

    storedProcedureItemReader.setRowMapper(new BeanPropertyRowMapper<TransactionReportingBean>(TransactionReportingBean.class));
    storedProcedureItemReader.afterPropertiesSet();

    storedProcedureItemReader.setVerifyCursorPosition(false);
    storedProcedureItemReader.close();
    return storedProcedureItemReader;
}

错误:

  

原因:   org.springframework.dao.TransientDataAccessResourceException:   执行存储过程; SQL [{call getResult(?)} JZ0SB:参数   索引超出范围:0。嵌套异常是java.sql.SQLException:   JZ0SB:参数索引超出范围:0。         在org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:110)         在org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)         在org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)         在org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)         在org.springframework.batch.item.database.StoredProcedureItemReader.openCursor(StoredProcedureItemReader.java:228)         在org.springframework.batch.item.database.AbstractCursorItemReader.doOpen(AbstractCursorItemReader.java:426)         在org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:146)         ...更多33       原因:java.sql.SQLException:JZ0SB:参数索引超出范围:0。         com.sybase.jdbc4.jdbc.ErrorMessage.raiseError(未知来源)         在com.sybase.jdbc4.jdbc.ParamManager.int(未知来源)         在com.sybase.jdbc4.jdbc.ParamManager.doGetOutValueAt(未知来源)         在com.sybase.jdbc4.jdbc.ParamManager.doGetOutObjectAt(未知来源)         在com.sybase.jdbc4.jdbc.ParamManager.getOutObjectAt(未知来源)         在com.sybase.jdbc4.jdbc.SybCallableStatement.getObject(未知来源)         在org.apache.tomcat.dbcp.dbcp.DelegatingCallableStatement.getObject(DelegatingCallableStatement.java:144)         在org.apache.tomcat.dbcp.dbcp.DelegatingCallableStatement.getObject(DelegatingCallableStatement.java:144)         在org.springframework.batch.item.database.StoredProcedureItemReader.openCursor(StoredProcedureItemReader.java:221)         ...另外35个       2018-10-15 16:57:25-main-错误[AbstractStep:274]:在步骤“作业中”关闭步骤执行资源时发生异常   dataExtractorStepJob       org.springframework.batch.item.ItemStreamException:关闭项目阅读器时出错

1 个答案:

答案 0 :(得分:0)

首先,您需要删除storedProcedureItemReader.close(),Spring Batch将在结果集的末尾自动关闭阅读器。

根据堆栈跟踪,您可能需要将refCursorPosition设置为1:

storedProcedureItemReader.setRefCursorPosition(1);

希望这会有所帮助。