- - PR -
複数の結果セットが取得できません!
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2003-12-11 14:48
現在、ストアドプロシージャを発行したときの処理を作成していますが、
そこで悩んでいます。 環境と実現したい事は以下のとおりです。 -------------------------------------------- ▼環境 ・Windows2000 ・SDK1.3.1(1.4以降はNG) ・DB2 - Enterprise Server Edition ▼要件 ・ストアドプロシージャで2つのSQLを発行し、 その2つの結果セットに対してアクセスしたい。 ▼試したこと ・以下のストアドプロシージャとJavaソースを実行しました。 すると1つ目の結果セットには通常通りアクセスできるのですが、 CallableStatementのメソッドgetMoreResults()を実行すると、 次の結果セットにアクセスできません。 getMoreResults()を実行したあとに ResultSet rs = CallableStatement.getMoreResults() を実行すると nullになってしまいます。 対象のストアドプロシージャはDB2のコマンドウィンドウ上で実行すると 確実に結果セットが2つ取得できるので、まちがっていることは ないと思われます。 ・やりたいことは以下の順の処理なんですが、 1.rs = callSt.getResult(); 2.callSt.getMoreResults(); 3.rs = callSt.getResult(); 試しにちょっと変えて実行してみました。 1.callSt.getMoreResults(); 2.rs = callSt.getResult(); すると2つ目の結果セットにアクセスできるのです。 ただし、この場合は当然1つ目の結果セットには アクセスできていません。 -------------------------------------------- なおCallableStatementの変数を複数用意すれば可能ですが、 (取得する結果セットの数分用意) CallableStatementの変数を複数用意するということは、 変数の数分ストアドを実行するということになるので 今回はNGとなります。 (1つのストアドプロシージャの中で更新系のSQLと 結果セットを取得するSQLがあるためです) 上記の内容で何かご存知の方がいらっしゃれば、ご教授願います。 よろしくお願いします。 ▼以下対象のストアドプロシージャ --------------------------------------------- DROP PROCEDURE proc01@ -- -- proc01 -- CREATE PROCEDURE proc01 ( ) LANGUAGE SQL DYNAMIC RESULT SETS 2 BEGIN DECLARE SQLCODE INTEGER DEFAULT 0; -- 1つ目のSQL発行 DECLARE cur1 CURSOR WITH RETURN FOR SELECT ID_PON, CD_MODEL FROM WWUZT801 WHERE ID_PON = '9876543210'; -- 2つ目のSQL発行 DECLARE cur2 CURSOR WITH RETURN FOR SELECT ID_PON, CD_MODEL FROM WWUZT801 WHERE ID_PON < '9999999999'; -- 1つ目のカーソルオープン OPEN cur1; -- 2つ目のカーソルオープン OPEN cur2; END @ ▼以下対象のJavaソース --------------------------------------------- private void callStoredProcedure(Connection con) throws WACSDBApplException, WACSDBSysException, WACSSysException { ResultSet rs = null; CallableStatement callSt = null; // ステートメントを作り、CallableStatementオブジェクトを生成する try { callSt = conn.prepareCall("{call proc01()}"); // 呼出実行 callSt.execute(); // 1つ目の結果セット取得 rs = callSt.getResultSet(); // (fetch用内部メソッドCall) fetchAll(rs); // 次の結果セット(問題の箇所!) callSt.getMoreResults(); // 2つ目の結果セット取得(これがnullになってしまう) rs = callSt.getResultSet(); // (fetch用内部メソッドCall) fetchAll(rs); } catch (SQLException e) { handleSQLSysException(e); }finally { close(rs); close(callSt); } } |
|
投稿日時: 2003-12-11 15:25
DB2は試したことないですが、Oracle, SQL Serverでは下記みたいな感じでうまくいきました。
// 呼出実行 および 1つ目の結果セット取得 rs = callSt.executeQuery(); ・・・処理 // 次の結果セットがあるか? if (callSt.getMoreResults()) { // 2つ目の結果セット取得 rs = callSt.getResultSet(); } |
|
投稿日時: 2003-12-11 15:49
返信ありがとうございます。
Oracleではそうですか。 DB2をインストールするとサンプルソースがついてくるのですが、 まったくそのとおりやってるんですけどね。 現在も悪戦苦闘中です。 何か分かる方はさらにご教授願います。 よろしくお願いします。 |
1
