SpringJdbc経由でOracleのストアドプロシージャを呼んでみた。
// JdbcTemplate作成 JdbcTemplate template = new JdbcTemplate(getDataSource()); // 戻り値をcaseInSensitiveで扱う template.setResultsMapCaseInsensitive(true); // 呼び出し用SimpleJdbcCall作成 SimpleJdbcCall callProcedure = new SimpleJdbcCall(template); // プロシージャ名セット callProcedure.withProcedureName("PROCEDURE_NAME"); //引数パラメータ作成。 IN の宣言をしたものに対して、値をセット MapSqlParameterSource in = new MapSqlParameterSource(); in.addValue("PARAM1",1000); //実行 戻り値で OUT の宣言をしたパラメータが帰ってくる Map<?,?> out = callProcedure.execute(in); BigDecimal result = (BigDecimal)out.get("RESULT");
とても分かりやすい。
ちなみにだが、オラクルでパッケージつきのストアドを宣言した場合、プロシージャ名の前に.をつけてパッケージ名書いとけば動くだろうJK、と思ったらまんまとエラーになった。
//実行時にエラーになる callProcedure.withProcedureName("PACKAGE_NAME.PROCEDURE_NAME");
ただ、スローされた例外メッセージに
org.springframework.dao.InvalidDataAccessApiUsageException: Unable to determine the correct call signature for PACKAGE_NAME.PROCEDURE_NAME - package name should be specified separately using '.withCatalogName("PACKAGE_NAME")'
と書いてあっため、Springの母心に感謝しつつ大至急
callProcedure.withCatalogName("PACKAGE_NAME").withProcedureName("PROCEDURE_NAME");
と修正して、そして自分の手柄にしたのだった。