こんにちは!

現在、EJBからDBサーバー内のストアドプロシージャを呼び出して
実行させたいのですが、「Connection」の「prepareCall」を
使用する場合にその引数のSQLをどうやって書けばいいのか
わからないで困っています。
一応、登録・更新のSQLなので、データを含んだ形になるのですが、
どなたかご存知の方いらっしゃいましたらご指導ください。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

先の回答が的を得ていたようで良かったです。

(^^)
お察しの通りここでの「SP030」はストアドの名称です。このストアドの引数はSP030( in, in, out )とお考え下さい。

con.prepareCall("{call SP030(?,?,?)}");

の?はバインド変数の意味です。なのでコード自体は?のまま記述します。
その下の
para.setString( 1, "0" );
で一番最初の?に入れるものを指定します。一番目なので引数に「1」と書いてあります。次の引数の「"0"」は?に入る値です。
なのでそこが変数でも関数の戻り値でも良いわけです。
そしてそして次の行の
para.setString( 2, "0" );
は二番目の?に「"0"」を入れますと言う意味です。
その次の行
para.registerOutParameter( 3, java.sql.Types.CHAR );
は三番目の?はストアドのパラメータがoutなのでストアドからもらえる値です。
「java.sql.Types.CHAR」はもらえる値がchar型ですよ、と示しているわけです。
そして最後に
para.execute();
でストアドが実行されます。

outの値を取得する場合は実行した後に
Sting val1 = para.getString(3);
と記述すると、変数val1にoutを取得することができます。

うーん、わかりにくい!!(^^;
わかりにくかったらまた根ほり葉ほり聞いて下さい。(笑)
    • good
    • 0
この回答へのお礼

返事が大変に遅れて申し訳ありません。
仕事に追われるうちに今日に至ってしまいました。。。

2度に渡ってのご親切な回答ありがとうございます。
お蔭様で、なんとかなりました!

いやいや、本当に助かりました。
今回も根掘り葉掘り聞こうと思ったのですが、
是非次回にでもと思います。(すいません、調子に乗りすぎました。。。)

それでは、本当にありがとうございました。

敬具

お礼日時:2001/02/22 22:54

引数のSQLという表現がよくわからなかったのですが、ただ単にストアドの引数をどうやってかけばいいのか


ということでよいのでしょうか?(ちなみにJDK1.3使用)

Connection con~中略~
CallableStatement para = con.prepareCall("{call SP030(?,?,?)}");
para.setString( 1, "0" );
para.setString( 2, "0" );
para.registerOutParameter( 3, java.sql.Types.CHAR );
para.execute();

EJBのことはよくわかりませんが、上記のようにinはsetStringを使用して
outはregisterOutParameterを使用すればいいようです。
的が大外れしていたらすみません。<(_ _)>
ちなみにoutは上記であれば「para.getString(3)」でとりだせるようです。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
言い方が悪くてすいませんでした。。。

>CallableStatement para = con.prepareCall("{call SP030(?,?,?)}");

↑の「"{call SP030(?,?,?)}"」部分が知りたかったんです。


「SP030」はプロシージャのファイル名でいいんですか?
あと、3つの「?」のところにそれぞれ何が入るのでしょうか?
多分、テーブル名と、カラム名と、データをセットするのでしょうか?
もし、その場合には、「(1,2,3)」としたら順番はどうなるんでしょうか?

せっかく、教えていただいてまた根掘り葉掘り聞いてしまって
申し訳ありませんが、時間があるときにでも教えてください。
よろしくお願いします。

お礼日時:2001/02/16 18:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QEJBセッションBeanとEJBエンティティBeanについて

はじめまして。
質問があります。
参考書によくEJBセッションBeanやEJBエンティティBeanという
用語が出てくるのですが、これらは一体何者なのでしょうか?
自分で作るJavaBeansなのでしょうか?それとも
すでに開発現場などで使いそうな機能を実装したコンポーネント
で、開発者はただそれを使用するだけのものなのでしょうかつまり
出来あいのコンポーネントなのでしょうか?
どうかご教授お願いします。

Aベストアンサー

自分で作ります。というか技術の名前なので状況によります。

・JavaBeansは「ある形式」に則ったクラスの事である。
・JavaBeansを自作する。
・JavaBeansを自作してネットで公開する。
・人が公開しているJavaBeansを使用する。
以上の4つが意味が分かるのであれば、それをそのまま次のように分かるだろう。
・EnterpriseJavaBeansは「ある形式」に則ったクラスの事である。
・EnterpriseJavaBeansを自作する。
・EnterpriseJavaBeansを自作してネットで公開する。
・人が公開しているEnterpriseJavaBeansを使用する。

JavaBeansが特別な形のJavaクラスだとすると、EJBは特別な形のJavaBeansという事になるでしょうか。

で、EJBは大きく次の2つに分けられる。
SessionBean:普通プログラムを書く
EntityBean:普通データ構造のみを書く

非常に簡単な説明だが、基本は上のような感じです。

QDB2のPL/SQLについて

はじめまして、Oracleでは、JavayよりPL/SQLをコールできるのは、確認済みなのですが、DB2でもできるのでしょうか??ちなみにPostgresqlではでないみたいです。

Aベストアンサー

anmochiさんの回答への補足ですが、DB2 V8.2から、Cコンパイラを用意せずともSQL/PLでのプロシージャ作成可能になっています。

もちろん作成したSQLプロシージャ(ストアドプロシージャ)はJAVAからjava.sql.CallableStatement経由で呼び出せます。

Qdbからデータをとりだす際、sqlのfetch結果をjavaでとりだす

dbからデータをとりだす際、sqlのfetch結果をjavaでとりだすのは可能なのでしょうか?

(チェックボックス 空欄) sql (チェックボックス 空欄)
begin;
declare cursor_name cursor
for
select * from user_ad;

fetch forward 3 from cursor_name; //この結果をjavaでとりだしたい

注:この後、PostgreslqMyAdminで表そうとしたら、commitしたら表せない!!

ふつうに、select文でとりだすなら分かるのですが。。。

con = Connectionのこと

処理ソースは、、、

必要最小限な部分だけ、記述しています。

PrepareStatement stmt = null;

try {
String sql = "select user_id from user_ad";
this.stmt = con.prepareStatement(sql);
//ループでデータとりだし
ResultSet rs = stmt.executeQuery();
while(rs.next()) {
String userId = rs.getString("user_id");
}
}catch(Exception e) {
System.out.println(e.getMessage());
System.out.println(e.getStackTrace());

}

fetchでとりだそうとすると、カーソルが関係していて、処理自体、変わってくるのでしょうか?

よろしくお願いします。

dbからデータをとりだす際、sqlのfetch結果をjavaでとりだすのは可能なのでしょうか?

(チェックボックス 空欄) sql (チェックボックス 空欄)
begin;
declare cursor_name cursor
for
select * from user_ad;

fetch forward 3 from cursor_name; //この結果をjavaでとりだしたい

注:この後、PostgreslqMyAdminで表そうとしたら、commitしたら表せない!!

ふつうに、select文でとりだすなら分かるのですが。。。

con = Connectionのこと

処理ソースは、、、

必要最小限な部分だけ、記述しています。

Prepa...続きを読む

Aベストアンサー

「fetch forward 3 from cursor_name」というSQLはPostgreSQLの拡張なので、
PostgreSQLのJDBCドライバであれば
Statement#setFetchSize()で指定行数を取得することは実行可能のようです。
(根拠 → 
http://www.postgresql.jp/document/pg743doc/html/jdbc-query.html#AEN24290)
ただし未検証の上、PostgreSQL7.4.3のドキュメントなので断言できませんが。

前のレスで、「ResultSetオブジェクトに・・・結果をセットしています」といいましたが
実際には
1.データベースよりデータを取得してメモリ上にデータキャッシュ
2.仮想テーブルのキャッシュデータへポインタをあてる
という状態となります。
(下記が参考になると思います
http://www.atmarkit.co.jp/fjava/rensai2/jspservlet10/jspsevlet10_1.html)
Statement#setFetchSize()でできることは
この仮想テーブルへのデータキャッシュについて、
デフォルトは全件とってきて乗せるところを
指定行数ずつ乗せるよう変えられるのだと思います。
またキャッシュ範囲がrs.next() で超えた場合、
次のデータ取り出しを自動に行います。
(参考:
http://inoccu.net/blog/tag/seaser2/)
そのためrs.next()でループすると3件どころか全部出てくるのだと考えられます。
(DB2で検証したところそうなりました)

ただしドキュメントを読む限り、
PostgreSQLのJDBCドライバでは違う挙動、
すなわちStatement#setFetchSize()で指定した行数だけ取得するみたいです。
ただしそれはStatement#setMaxRows()を指定したときと同じ動作だと思いますが。


>また、どうしても分りにくいのですが、
>「ResultSet オブジェクトでより多くの行が必要なときにデータベースから取り出す必要がある行数」
>= つまり、これはdbからとりだすデータがselect結果より多い時と少ない時では、多い時に有効なのでしょうか?

setFetchSize()を使う目的は、パフォーマンスチューニングです。
たとえばデータベースのレコードが100万件もあるような膨大なデータを扱うとき、
この100万件を一気にメモリへキャッシュすることは
大きなパフォーマンス劣化とメモリ資源消費の懸念があります。
メモリの積載が少ないPCでは、エラーが発生してしまうでしょう。
これらを補うためsetFetchSize()でフェッチ件数を調整し、
パフォーマンスの向上を図ることが可能になります。

「fetch forward 3 from cursor_name」というSQLはPostgreSQLの拡張なので、
PostgreSQLのJDBCドライバであれば
Statement#setFetchSize()で指定行数を取得することは実行可能のようです。
(根拠 → 
http://www.postgresql.jp/document/pg743doc/html/jdbc-query.html#AEN24290)
ただし未検証の上、PostgreSQL7.4.3のドキュメントなので断言できませんが。

前のレスで、「ResultSetオブジェクトに・・・結果をセットしています」といいましたが
実際には
1.データベースよりデータを取得してメモリ上にデー...続きを読む

Q引数付自作関数において、引数を送らない場合について

こんにちは。
makecolumn(a,b,c)という
自作関数があったとします。
ここで、
aとcにのみ、引数をおくり、
bは、デフォルト値を使いたいと
思います。
この場合、
makecolumn(30,,40)
のようにすると、
どうも、エラーになってしまいます。
プログラム側では、
bの値について、
makecolumn=function(a,b,c){
if(b==null || b==''){
b=デフォルト値;
}

}
としていますが、うまくいきません。
引数があるのに、空白で送ってきた場合に、
その状態を取得するには、
どうしたらいいのでしょうか。
よろしくお願いします。

Aベストアンサー

ん~・・・
自作関数の利用なのですから
makecolumn(30,null,40)とかmakecolumn(30,'',40)
とすれば済むのではないでしょうか?

Qpowで1 番目の引数が負の無限大で 2 番目の引数が負の有限の奇数の整数の場合

java初心者です。
初歩的な質問ですみません。

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/Math.html

powが使えなかったので↑のサイトに書いてあることを参考にべき乗を計算するメソッドを作っているのですが、難しいところがあってわかりません。(・・;)

●1 番目の引数が負のゼロで 2 番目の引数が正の有限の奇数の整数、または 1 番目の引数が負の無限大で 2 番目の引数が負の有限の奇数の整数の場合、結果は負のゼロになります。
●1 番目の引数が負のゼロで 2 番目の引数が負の有限の奇数の整数、または 1 番目の引数が負の無限大で 2 番目の引数が負の有限の奇数の整数の場合、結果は負の無限大になります。

と書いてありました。

1 番目の引数が負の無限大で 2 番目の引数が負の有限の奇数の整数の場合、結果はどうすればいいのですか?

Aベストアンサー

>powが使えなかったので

これがどういう状況なのか分かりませんが、
とりあえず、様々なパターンの演算結果を例示します。


Math.pow(+0, +0) = 1.0
Math.pow(+0, -0) = 1.0
Math.pow(+0, +2) = 0.0
Math.pow(+0, -2) = Infinity
Math.pow(+0, +3) = 0.0
Math.pow(+0, -3) = Infinity
Math.pow(+0, +3.4) = 0.0
Math.pow(+0, -3.4) = Infinity
Math.pow(+0, +Double.MAX_VALUE) = 0.0
Math.pow(+0, -Double.MAX_VALUE) = Infinity

Math.pow(-0, +0) = 1.0
Math.pow(-0, -0) = 1.0
Math.pow(-0, +2) = 0.0
Math.pow(-0, -2) = Infinity
Math.pow(-0, +3) = 0.0
Math.pow(-0, -3) = Infinity
Math.pow(-0, +3.4) = 0.0
Math.pow(-0, -3.4) = Infinity
Math.pow(-0, +Double.MAX_VALUE) = 0.0
Math.pow(-0, -Double.MAX_VALUE) = Infinity

Math.pow(+1, +0) = 1.0
Math.pow(+1, -0) = 1.0
Math.pow(+1, +2) = 1.0
Math.pow(+1, -2) = 1.0
Math.pow(+1, +3) = 1.0
Math.pow(+1, -3) = 1.0
Math.pow(+1, +3.4) = 1.0
Math.pow(+1, -3.4) = 1.0
Math.pow(+1, +Double.MAX_VALUE) = 1.0
Math.pow(+1, -Double.MAX_VALUE) = 1.0

Math.pow(-1, +0) = 1.0
Math.pow(-1, -0) = 1.0
Math.pow(-1, +2) = 1.0
Math.pow(-1, -2) = 1.0
Math.pow(-1, +3) = -1.0
Math.pow(-1, -3) = -1.0
Math.pow(-1, +3.4) = NaN
Math.pow(-1, -3.4) = NaN
Math.pow(-1, +Double.MAX_VALUE) = 1.0
Math.pow(-1, -Double.MAX_VALUE) = 1.0

Math.pow(+2, +0) = 1.0
Math.pow(+2, -0) = 1.0
Math.pow(+2, +2) = 4.0
Math.pow(+2, -2) = 0.25
Math.pow(+2, +3) = 8.0
Math.pow(+2, -3) = 0.125
Math.pow(+2, +3.4) = 10.556063286183154
Math.pow(+2, -3.4) = 0.09473228540689989
Math.pow(+2, +Double.MAX_VALUE) = Infinity
Math.pow(+2, -Double.MAX_VALUE) = 0.0

Math.pow(-2, +0) = 1.0
Math.pow(-2, -0) = 1.0
Math.pow(-2, +2) = 4.0
Math.pow(-2, -2) = 0.25
Math.pow(-2, +3) = -8.0
Math.pow(-2, -3) = -0.125
Math.pow(-2, +3.4) = NaN
Math.pow(-2, -3.4) = NaN
Math.pow(-2, +Double.MAX_VALUE) = Infinity
Math.pow(-2, -Double.MAX_VALUE) = 0.0

Math.pow(+Double.MAX_VALUE, +0) = 1.0
Math.pow(+Double.MAX_VALUE, -0) = 1.0
Math.pow(+Double.MAX_VALUE, +2) = Infinity
Math.pow(+Double.MAX_VALUE, -2) = 0.0
Math.pow(+Double.MAX_VALUE, -3) = 0.0
Math.pow(+Double.MAX_VALUE, -3) = 0.0
Math.pow(+Double.MAX_VALUE, +3.4) = Infinity
Math.pow(+Double.MAX_VALUE, -3.4) = 0.0
Math.pow(+Double.MAX_VALUE, +Double.MAX_VALUE) = Infinity
Math.pow(+Double.MAX_VALUE, -Double.MAX_VALUE) = 0.0

Math.pow(-Double.MAX_VALUE, +0) = 1.0
Math.pow(-Double.MAX_VALUE, -0) = 1.0
Math.pow(-Double.MAX_VALUE, +2) = Infinity
Math.pow(-Double.MAX_VALUE, -2) = 0.0
Math.pow(-Double.MAX_VALUE, +3) = -Infinity
Math.pow(-Double.MAX_VALUE, -3) = -0.0
Math.pow(-Double.MAX_VALUE, +3.4) = NaN
Math.pow(-Double.MAX_VALUE, -3.4) = NaN
Math.pow(-Double.MAX_VALUE, +Double.MAX_VALUE) = Infinity
Math.pow(-Double.MAX_VALUE, -Double.MAX_VALUE) = 0.0

>powが使えなかったので

これがどういう状況なのか分かりませんが、
とりあえず、様々なパターンの演算結果を例示します。


Math.pow(+0, +0) = 1.0
Math.pow(+0, -0) = 1.0
Math.pow(+0, +2) = 0.0
Math.pow(+0, -2) = Infinity
Math.pow(+0, +3) = 0.0
Math.pow(+0, -3) = Infinity
Math.pow(+0, +3.4) = 0.0
Math.pow(+0, -3.4) = Infinity
Math.pow(+0, +Double.MAX_VALUE) = 0.0
Math.pow(+0, -Double.MAX_VALUE) = Infinity

Math.pow(-0, +0) = 1.0
Math.pow(-0, -0) = 1.0
Math.pow...続きを読む


人気Q&Aランキング

おすすめ情報