2015-10-20 2 views
2

Я пытаюсь вызвать ХПНевозможно прочитать REF_CURSOR с StoredProcedureItemReader

create or replace PROCEDURE "PROC"(cur OUT SYS_REFCURSOR) 

с этим компонентом.

@Bean 
    StoredProcedureItemReader<?> itemReader() { 
     StoredProcedureItemReader<?> storedProcedureItemReader = new StoredProcedureItemReader<>(); 
     storedProcedureItemReader.setDataSource(dataSource); 
     storedProcedureItemReader.setProcedureName("PROC"); 
     storedProcedureItemReader.setRefCursorPosition(1); 
     storedProcedureItemReader.setRowMapper(new ColumnMapRowMapper()); 
     storedProcedureItemReader.open(new ExecutionContext()); 
     return storedProcedureItemReader; 
    } 

Но я получаю

org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:134) 
    ... 54 more 
Caused by: java.sql.SQLException: Invalid column index 
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:125) 
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:304) 
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:393) 
    at oracle.jdbc.driver.OracleCallableStatementWrapper.registerOutParameter(OracleCallableStatementWrapper.java:1569) 
    at org.springframework.batch.item.database.StoredProcedureItemReader.openCursor(StoredProcedureItemReader.java:202) 
    ... 56 more 

Как я могу назвать PROC с только один из курсора и получить итерацию результат?

ответ

0

Я думаю, вам нужно добавить параметр к считывателю для параметра out cur. Попробуйте добавить следующую строку перед тем, как открыть storedProcedureItemReader:

storedProcedureItemReader.setParameters(new SqlParameter[] { new SqlParameter("cur", OracleTypes.CURSOR) }); 
0

То, как я использую здесь, мы должны установить cursor's положение в противном случае пружина будет пытаться сделать GetObject (0)!

@Bean 
    public ItemReader<FailuredProcess> getFailuredProcessReader() throws BatchOMSException { 
     StoredProcedureItemReader<FailuredProcess> reader; 

     try { 
      reader = new StoredProcedureItemReader<FailuredProcess>(); 

      reader.setDataSource(dataSource); 
      reader.setProcedureName(queryHelper.getQuery("query.oms.listFailuredProcessJobs")); 
      reader.setRowMapper(new AlarmRowMapper()); 
      reader.setPreparedStatementSetter(new PreparedStatementSetterAdapter()); 
      reader.setVerifyCursorPosition(false); 
      reader.setParameters(new SqlParameter[] { new SqlParameter("cur", OracleTypes.CURSOR) }); 
      reader.setRefCursorPosition(NumberUtils.INTEGER_ONE); 
      reader.afterPropertiesSet(); 

      return reader; 
     } catch (Exception e) { 
      LOGGER.error(e.getMessage(), e); 
      throw new BatchOMSException(e); 
     } 
0

@Bean @Profile ("пакет") общественного ItemReader readerProcedureCall() бросает исключение { StoredProcedureItemReader читатель = новый StoredProcedureItemReader <>();

LOGGER.info("***** About getting ResultSet From Procedure **** "); 
    reader.setDataSource(omniflowDataSource); 
    reader.setProcedureName("proce name"); 
    reader.setRowMapper(new CustomRowMapper()); 
    reader.setPreparedStatementSetter(new PreparedStatementSetter(){ 
     @Override 
     public void setValues(PreparedStatement ps) throws SQLException{ 
      CallableStatement eventCallableSt=(CallableStatement)ps; 
       eventCallableSt.registerOutParameter(1, OracleTypes.CURSOR); 
     } 
    }); 
    reader.setVerifyCursorPosition(false); 
    reader.setParameters(new SqlParameter[] {new SqlParameter("pCusRecOut",OracleTypes.CURSOR)}); 
    reader.setRefCursorPosition(NumberUtils.INTEGER_ONE); 
    reader.afterPropertiesSet(); 

    return reader; 
} 
+0

Обновите свой ответ более подробно, только ответ на код не так полезен + потратить некоторое время на форматирование –

Смежные вопросы