- PR -

複数の結果セットが取得できません!

1
投稿者投稿内容
daisuke
会議室デビュー日: 2003/04/02
投稿数: 2
投稿日時: 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);
}
}
yuzy
大ベテラン
会議室デビュー日: 2002/02/14
投稿数: 117
投稿日時: 2003-12-11 15:25
DB2は試したことないですが、Oracle, SQL Serverでは下記みたいな感じでうまくいきました。

// 呼出実行 および 1つ目の結果セット取得
rs = callSt.executeQuery();

・・・処理

// 次の結果セットがあるか?
if (callSt.getMoreResults()) {
// 2つ目の結果セット取得
rs = callSt.getResultSet();
}
daisuke
会議室デビュー日: 2003/04/02
投稿数: 2
投稿日時: 2003-12-11 15:49
返信ありがとうございます。
Oracleではそうですか。
DB2をインストールするとサンプルソースがついてくるのですが、
まったくそのとおりやってるんですけどね。

現在も悪戦苦闘中です。

何か分かる方はさらにご教授願います。
よろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)