0

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 つ得られます。あまり意味がないことはわかっていますが(少なくとも私には意味がありません)、何かばかげたものを見逃しているに違いありません。

私は何を間違っていますか?

4

1 に答える 1