SpringJdbcでOracleのストアドプロシージャを呼ぶ

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");


と修正して、そして自分の手柄にしたのだった。