2013-03-29 55 views
0

我在我的Oracle DB中有一個存儲過程,它返回一個CURSOR並且工作正常。我想在沒有任何Object持久性的情況下在Java中檢索遊標的數據。我唯一的目標是將其顯示在屏幕上。由於我將有數十個存儲過程,並且我不想創建與它們對應的新RowMapper,所以我嘗試使用RowSetDynaClass。如何使用RowSetDynaClass和Spring RowMapper來檢索ResultSet的所有行?

我春子類對象的StoredProcedure像這樣:

public abstract class AbstractReport extends StoredProcedure { 

    public static final String KEY_REPORT_RESULT = "profiles"; 

    public AbstractReport(DataSource dataSource, String sprocName) { 
     super(dataSource, sprocName); 
     declareParameter(new SqlOutParameter(
       KEY_REPORT_RESULT, 
       oracle.jdbc.OracleTypes.CURSOR, 
       new RowMapper() { 
        public RowSetDynaClass mapRow(ResultSet argResults, int argRowNum) throws SQLException { 
         return new RowSetDynaClass(argResults); 
        } 
       }) 
     ); 
//  declareParameter(new SqlOutParameter(
//    "test", 
//    oracle.jdbc.OracleTypes.CURSOR, 
//    new RowMapper() { 
//     public String[] mapRow(ResultSet argResults, int argRowNum) throws SQLException { 
//      return new String[]{argResults.getString(1), argResults.getString(2), argResults.getString(3)}; 
//     } 
//    }) 
//  ); 
     compile(); 
    } 

    @SuppressWarnings("unchecked") 
    public Map<String, Object> computeReport(Map<String, Object> params){ 
     return super.execute(params); 
    } 
... 

} 

這被稱爲是這樣的:

public List<String[]> computeReport(Map<String, Object> params, ReportEnum report) throws EptServiceException { 
     List<String[]> result; 

     try { 
      logger.debug("Computing report " + report); 
      AbstractReport procedure = getReport(report); 

      Map<String, Object> rawResult = procedure.computeReport(params); 
      logger.info("rawResult:" + rawResult); 
      result = generateReportOutput(rawResult); 
     } catch (EptServiceException e) { 
      throw e; 
     } catch (Exception e) { 
      logger.error("Error while computing report:" + report, e); 
      throw new EptServiceException(EsbPortalError.ERROR_PORTAL_UNKNOWN, e); 
     } 

     return result; 
    } 

所有這一切工作幾乎完全好,除了我的思念從結果一行。當我在SQL中執行存儲過程時,我有3個結果。 如果我使用一個簡單的RowMapper,就像上面評論中那樣,我有3個結果。

但是,如果我使用RowSetDynaClass我得到一個對象2行,而不是3預期。我知道它沒有什麼意義(至少它不適合我),但一定有一些我失蹤的愚蠢。

我在做什麼錯?

回答

1

我終於明白了(主要是)。我無法找到使用RowMapper界面使其工作的方法。因此,我使用ResultSetExtractor對象如下:

declareParameter(new SqlOutParameter(
      KEY_REPORT_RESULT, 
      oracle.jdbc.OracleTypes.CURSOR, 
      new ResultSetExtractor() { 

       @Override 
       public Object extractData(ResultSet rs) throws SQLException, 
         DataAccessException { 
        return new RowSetDynaClass(rs); 
       } 
      }) 
); 

這將輸出我正確的三個結果,我期待。至於爲什麼RowMapper不起作用,但我不知道這個。

相關問題