我在我的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預期。我知道它沒有什麼意義(至少它不適合我),但一定有一些我失蹤的愚蠢。
我在做什麼錯?