ストアド プロシージャから複数の結果セットを取得しようとすると、奇妙な結果が得られます。SQL Server Management Studio から直接実行すると、ストアド プロシージャは正常に動作します。
myProc= conn.prepareCall("{? = call abc.foo(?, ?, ?, ?, ?, ?, ?, ?, ?)}");
myProc.registerOutParameter(1, java.sql.Types.INTEGER);
myProc.setString(2, lookup.getEmailAddress());
//...other parameters
boolean isResultSet = myProc.execute(); //returns true
dbReturnVal = myProc.getInt(1); //correctly retrieves return code
ResultSet rs = myProc.getResultSet(); //returns NULL
while (rs.next()) { //exception
と の javadoc があるため、これは混乱を招きexecute
ますgetResultSet
。
execute: 最初の結果が ResultSet オブジェクトの場合は true を返します。最初の結果が更新カウントであるか、結果がない場合は false
getResultSet: ResultSet オブジェクトとしての現在の結果、または結果が更新カウントである場合、または結果がこれ以上ない場合は null
結果がこれ以上ない場合、getResultSet はここでのみ null を返す必要がありますよね? ただし、SQL サーバーでクエリを実行すると、3 つの結果セットが返されることがわかっています。
テストとして、getMoreResults()
何らかの理由で結果セットが欠落しているかどうかを確認するために実行しました。
dbReturnVal = myProc.getInt(1); //correctly retrieves return code
if(myProc.getMoreResults())
{
ResultSet rs = myProc.getResultSet(); //STILL returns null
while (rs.next()) { //exception
...
getMoreResults
true を返しますが、結果セットを取得しようとすると、まだ NULL が返されます。結果セットをスキップするため、これはとにかく私が望むものではありませんが、少なくとも2番目の結果セットを取得する必要があります。
何が原因でしょうか? SQL Server が問題を引き起こしている結果セットを返す方法について何かありますか、それとも私が見逃しているものがありますか? 任意の提案をいただければ幸いです。
アップデート
これは、私が作成した出力パラメータに関連していたことが判明しました
myProc= conn.prepareCall("{? = call abc.foo(?, ?, ?, ?, ?, ?, ?, ?, ?)}");
myProc.registerOutParameter(1, java.sql.Types.INTEGER);
パラメータを削除し、呼び出しを更新しました
myProc= conn.prepareCall("{call abc.foo(?, ?, ?, ?, ?, ?, ?, ?, ?)}");
//myProc.registerOutParameter(1, java.sql.Types.INTEGER);
//moved up my parameters by 1
そしてそれはうまくいきました。3 つの結果セットすべてを正しく取得できるようになりました。戻りコードはあまり気にしないので、おそらくこれで問題ありません。学術的な観点から、なぜ出力パラメータが結果セットの取得に問題を引き起こすのでしょうか?