Oracle DB に、CURSOR を返し、正常に動作するストアド プロシージャがあります。オブジェクトの永続化を行わずに Java でカーソルのデータを取得したいと考えています。私の唯一の目標は、それを画面に表示することです。何十ものストアド プロシージャがあり、それぞれに対応する新しい RowMapper を作成したくないので、RowSetDynaClass を使用しようとしました。
Spring 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 を使用すると、予想される 3 行ではなく、2 行のオブジェクトが 1 つ得られます。あまり意味がないことはわかっていますが(少なくとも私には意味がありません)、何かばかげたものを見逃しているに違いありません。
私は何を間違っていますか?