0

ストアド プロシージャから複数の結果セットを取得しようとすると、奇妙な結果が得られます。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
...

getMoreResultstrue を返しますが、結果セットを取得しようとすると、まだ 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 つの結果セットすべてを正しく取得できるようになりました。戻りコードはあまり気にしないので、おそらくこれで問題ありません。学術的な観点から、なぜ出力パラメータが結果セットの取得に問題を引き起こすのでしょうか?

4

2 に答える 2

0

間違っているかもしれませんが、この通話の使用法は初めて見ました

"{? = call abc.foo(?, ?, ?, ?, ?, ?, ?, ?, ?)}"

一般に、中かっこ内の呼び出しでパラメーターを設定します。更新された通話で行ったように

ご利用状況はこちらからご確認いただけます。 http://www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-out-parameter-example/

ストアド プロシージャの宣言に注意してください。ストアド プロシージャでは、宣言自体で OUT パラメータを設定せずに結果セットを返す方法はありません。

呼び出しているストアド プロシージャのソースにアクセスできますか

于 2013-11-08T19:12:18.643 に答える