StoredProcedureItemReader в загрузочном пакете Spring - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь прочитать хранимую процедуру DB2 в пакетном режиме, используя StoredProcedureItemReader для курсора. Строка sql не выполняется, sql по умолчанию передается в jdbctemplate

    public class MyItemPreparedStatementSetter implements PreparedStatementSetter {

    @Override
    public void setValues(PreparedStatement ps) throws SQLException {

        ps.setString(1, "UH");
        ((CallableStatement) ps).registerOutParameter(2, Types.VARCHAR);
        ((CallableStatement) ps).registerOutParameter(3, Types.CHAR);
        ((CallableStatement) ps).registerOutParameter(4, Types.INTEGER);
    }

}
   @Bean
public StoredProcedureItemReader<PrintResponse> jdbcReader(JdbcTemplate jdbcTemplate) throws Exception {
    StoredProcedureItemReader<PrintResponse> storedProcedureItemReader = new StoredProcedureItemReader<>();
    SqlParameter[] parameters = {new SqlParameter("@I_PRODUCT_CDE", Types.CHAR)
            , new SqlParameter("@O_ERROR_MESSAGE", Types.VARCHAR), new SqlParameter("@O_SQLSTATE", Types.CHAR)
            ,new SqlParameter("@O_SQLCODE", Types.INTEGER)};

    storedProcedureItemReader.setFunction(true);        
    storedProcedureItemReader.setDataSource(jdbcTemplate.getDataSource());
    storedProcedureItemReader.setProcedureName("DEVTEST.PP_GETALLPRINTREADY");        
    storedProcedureItemReader.setRowMapper(new PolicyPrintResultRowMapper());
    storedProcedureItemReader.setParameters(parameters);
    storedProcedureItemReader.setPreparedStatementSetter(new MyItemPreparedStatementSetter());

    storedProcedureItemReader.setCurrentItemCount(0);

    storedProcedureItemReader.afterPropertiesSet();
    System.out.println(storedProcedureItemReader.getSql());

    return storedProcedureItemReader;       
}

Я использую шаг пакета, который вызывается заданием:

@Autowired
public JobBuilderFactory jobBuilderFactory;

@Autowired
public StepBuilderFactory stepBuilderFactory;

@Autowired
@Qualifier("jdbcTemplate")
JdbcTemplate jdbcTemplate; 

    @Bean
public ItemWriter<PrintResponse> fileWriter(@Value("${output}") Resource resource) {

    LineAggregator<PrintResponse> lineAggregator = new DelimitedLineAggregator<>();
    return new FlatFileItemWriterBuilder<PolicyPrint>()
            .name("file-writer")
            .resource(resource) 
            .lineAggregator(lineAggregator)
            .build();
}

@Bean
public Job jobPrintRecord(JobBuilderFactory jobBuilderFactory, Step step1) {
    return jobBuilderFactory.get("jobPrintAll")
            .incrementer(new RunIdIncrementer())
            .start(step1)
            .build();
 }

@Bean
public Step step1() throws Exception {
    return stepBuilderFactory.get("step1")
            .<PrintResponse, PrintResponse>chunk(5)
            .reader(jdbcReader(jdbcTemplate))
            .writer(fileWriter(null))
            .build();
}

Здесь передается запрос по умолчанию:

неправильная грамматика SQL [SELECT JOB_INSTANCE_ID, JOB_NAME из BATCH_JOB_INSTANCE, где JOB_NAME =? заказ по JOB_INSTANCE_ID desc];

Стек ошибок выглядит следующим образом:

 java.lang.IllegalStateException: Failed to execute CommandLineRunner org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:797) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]   ... 5 common frames omitted

Причина: com.ibm.db2.jcc.am.SqlSyntaxErrorException: ошибка SQL DB2: SQLCODE = -204, SQLSTATE = 42704, SQLERRMC = TEIWUDB1.BATCH_JOB_INSTANCE, DRIVER = 4.21.29 в com .ibm.db2.jcc.am.kd.a (kd.java:810) ~ [db2jcc4-11.1-4.21.29.jar: na] на com.ibm.db2.jcc.am.kd.a (кд. java: 66) ~ [db2jcc4-11.1-4.21.29.jar: na] на com.ibm.db2.jcc.am.kd.a (kd.java:140) ~ [db2jcc4-11.1-4.21.29.jar : na] на com.ibm.db2.jcc.am.sp.c (sp.java:2796) ~ [db2jcc4-11.1-4.21.29.jar: na] на com.ibm.db2.jcc.am.sp .d (sp.java:2784) ~ [db2jcc4-11.1-4.21.29.jar: na] на com.ibm.db2.jcc.am.sp.a (sp.java:2212) ~ [db2jcc4-11.1- 4.21.29.jar: na] на com.ibm.db2.jcc.am.tp.a (tp.java:7997) ~ [db2jcc4-11.1-4.21.29.jar: na] на com.ibm.db2. jcc.t4.bb.i (bb.java:148) ~ [db2jcc4-11.1-4.21.29.jar: na] на com.ibm.db2.jcc.t4.bb.b (bb.java:41) ~ [db2jcc4-11.1-4.21.29.jar: na] на com.ibm.db2.jcc.t4.pa (p.java:32) ~ [db2jcc4-11.1-4.21.29.jar: na] на com.ibm .db2.jcc.t4.vb.i (vb.java:145) ~ [db2jcc4-11.1-4.21.29.jar: na] на com.ibm.db2.jcc .am.sp.kb (sp.java:2181) ~ [db2jcc4-11.1-4.21.29.jar: na] at com.ibm.db2.jcc.am.tp.yc (tp.java:3698) ~ [ db2jcc4-11.1-4.21.29.jar: na] на com.ibm.db2.jcc.am.tp.a (tp.java:4578) ~ [db2jcc4-11.1-4.21.29.jar: na] на com. ibm.db2.jcc.am.tp.b (tp.java:4173) ~ [db2jcc4-11.1-4.21.29.jar: na] по адресу com.ibm.db2.jcc.am.tp.lc (tp.java : 770) ~ [db2jcc4-11.1-4.21.29.jar: na] на com.ibm.db2.jcc.am.tp.executeQuery (tp.java:735) ~ [db2jcc4-11.1-4.21.29.jar: na] at org.springframework.jdbc.core.JdbcTemplate $ 1.doInPreparedStatement (JdbcTemplate.java:666) ~ [spring-jdbc-5.0.5.RELEASE.jar: 5.0.5.RELEASE] в org.springframework.jdbc. .JdbcTemplate.execute (JdbcTemplate.java:605) ~ [spring-jdbc-5.0.5.RELEASE.jar: 5.0.5.RELEASE] ... 27 общих кадров опущено

Почему я не получаю набор результатов или не могу выполнить запрос. Я новичок в весенней партии и вроде застрял. Отладка показывает, источник данных настроен правильно.

Спасибо!

1 Ответ

0 голосов
/ 13 мая 2018

Проблема решена, я использовал использование памяти по умолчанию для Map вместо физической базы данных.Если у вас возникла та же проблема, переопределите setDatasource и оставьте его пустым, как указано ниже:

    public class BatchConfiguration extends DefaultBatchConfigurer
 { 
@Override public void setDataSource(DataSource dataSource) {
 // override to do not set datasource even if a datasource exist. 
// initialize will use a Map based JobRepository (instead of database) 
} 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...