- PR -

Javaからすストアドプロシージャ(DB2)の実行

1
投稿者投稿内容
ペーぺー01
常連さん
会議室デビュー日: 2005/05/29
投稿数: 45
投稿日時: 2005-07-08 20:25
おつかれさまです。

JavaからDB2にアクセスして、@〜Bの処理を実行して、
ストアドプロシージャを実行することを検討しています。
ストアドプロシージャを実行する場合に、ResultSetを返す場合が
あるようなのですが、どのような場合にResultSetが帰ってくるのでしょうか。
以下のストアドプロシージャではResultSetは帰ってきませんでした。

@Connectionを取得
AConnectionからCallableStatementのインスタンスを生成
BCallableStatementでストアドプロシージャの実行(executeQuery or executeUpdateメソッド)

ストアドプロシージャ
CREATE PROCEDURE TESTPRO (IN param1 decimal(10,0), OUT param2 decimal (10,0), OUT param3 decimal (10,0))
LANGUAGE SQL
BEGIN
set param2 = param1 * 2;
set param3 = (SELECT COLUMN1 FROM TABLEA WHERE TEXT1 = 'XXXX');
END
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-07-08 20:41
DB2のストアドは詳しくないので一般的な話ですが、

ちなみに欲しいのはアウトのパラメータでしょうか?
SQL自体レコードを返すようにはなっていないように見えましたので。

アウトのパラメータはResultSetには入りません。
(ここら辺って、JDBCドライバの実装次第で変わるかもしれませんが・・・)
アウトのパラメータはCallableStatement#registerOutParameterで登録し、
実行を行うとgetXXXで取得できたと思います。
ペーぺー01
常連さん
会議室デビュー日: 2005/05/29
投稿数: 45
投稿日時: 2005-07-09 23:06
かつのりさんご返答ありがとうございます。

registerOutParameterで、Outputはを設定し、プロシージャーの実行後に、CallableStatement#getXXXメソッドでOUTのパラメータは取得できています。

その後、調査していたのですが、プロシージャが以下のように結果セット
を返すような場合にResutSetが取得できるようです。
*以下はOracleのストアドプロシージャですが・・・

PROCEDURE test(rcset OUT refcur,
vUserId IN tt.user_name%type,
vAa IN tt.aa%type,
vFromDate IN VARCHAR2,
vToDate IN VARCHAR2)
IS
/*parameters*/
TYPE refcur IS REF CURSOR;
vDateFormat VARCHAR2(20);
BEGIN
/*initialize*/
vDateFormat := '''YYYY/MM/DD''';
/*make sql statement*/
s_Sql := 'SELECT id FROM tt';
s_Sql := s_Sql || ' WHERE user_name = :vUserId';
s_Sql := s_Sql || ' AND aa = :vAa';
s_Sql := s_Sql || ' AND action_dt >= to_date(:vFromDate,';
s_Sql := s_Sql || vDateFormat;
s_Sql := s_Sql || ')';
s_Sql := s_Sql || ' AND action_dt < (1 + to_date(:vToDate,';
s_Sql := s_Sql || vDateFormat;
s_Sql := s_Sql || '))';
s_Sql := s_Sql || ' ORDER BY action_dt';
/*set cursor*/
OPEN rcset FOR s_Sql using vUserId, vAa;

END test;
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-07-09 23:21
PL/SQLも詳しくないので良く知りませんが、
JDBCに関係なく、レコードが返されるクエリはResultSetで取得でき、
レコードが返されないものはResultSetでは返ってこないものと考えるべきでしょう。

しかしストアドの実行結果の処理は、あくまでJDBCドライバの実装次第です。
ドライバの実装次第ではカーソル変数取得用のクエリだけでもResultSetが返ってきたり、
SELECT文を実行してもResultSetが返らない実装もあり得ます。

折角商用のDBを使用しているのですから、仕様等での不明点は、
使用しているDBのベンダに問い合わせてみてはいかがでしょうか。
1

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