我正在实现春季批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:关闭项目阅读器时出错
答案 0 :(得分:0)
首先,您需要删除storedProcedureItemReader.close()
,Spring Batch将在结果集的末尾自动关闭阅读器。
根据堆栈跟踪,您可能需要将refCursorPosition
设置为1:
storedProcedureItemReader.setRefCursorPosition(1);
希望这会有所帮助。