「 Oracle ストアド プロシージャから JDBC 結果セットを返す」の記事で示したアプローチを使用しました。
String query = "{ call ? := sp_get_stocks(?) }";
CallableStatement stmt = conn.prepareCall(query);
stmt.registerOutParameter(1, OracleTypes.CURSOR);
stmt.setFloat(2, price);
stmt.execute();
ResultSet rs = (ResultSet)stmt.getObject(1);
while (rs.next()) {
//...
}
コードは仕事をしました。
ただし、コードで名前付きパラメーターを使用する傾向があり、これを次のように変更したいと考えていました。
stmt.registerOutParameter("returnvalue", OracleTypes.CURSOR);
stmt.setFloat("p$price", price);
これにより、オラクルエラーが発生しました:
java.sql.SQLException: ORA-06550: 行 1、列 12:
PLS-00103: 次のいずれかを想定しているときに、記号">"が検出されました:
:= . ( @ % ; 記号 "; が ">" の前に挿入されて続行しました。
関数の戻り値に名前を付けるために使用する特別な規則はありますか? それともこれは可能ですか?
PS:主に.Netで作業しているため、実際にはJavaは初めてです。そのため、非常に基本的なものが欠けている可能性があります。
更新しました
2つの入力パラメーター、1つの出力パラメーター、および関数の戻り値自体を使用してより複雑な関数を呼び出すと、このエラーが発生しないようです。この場合、名前付きパラメーターはうまく機能します。
問題OracleTypes.CURSOR
は関数の戻り値として発生しているようです...