0

「 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は関数の戻り値として発生しているようです...

4

2 に答える 2

0

基本的なものが欠けているとは思いません-私の知る限り、番号付きのパラメーターで立ち往生しています。

いくつかの定数を定義する (または enum を使用する) ことで、名前付きパラメーターをシミュレートできます。

private final static int returnvalue = 1;
private final static int p_price = 2;

......

stmt.registerOutParameter(returnvalue, OracleTypes.CURSOR);
stmt.setFloat(p_price, price);

しかし、それはあなたが得ようとしているのと同じくらい近いと思います

于 2013-07-03T03:28:57.130 に答える