- PR -

初めて投稿します!

投稿者投稿内容
jason
会議室デビュー日: 2004/07/08
投稿数: 16
投稿日時: 2004-07-08 20:39
こんにちは!初めて投稿するjasonです。今以下のプログラムを一つにまとめようとしているのですが、どこをどのように変えたらよいか分からず、いきずまっている状況です。もしよろしければ、だれかご教授よろしくお願いします。

//b1の値を求める
Statement st1 = conn.createStatement();
String sql1 = "select kosu * cadk as b1 FROM e_pro_pa,ca_shouhisha where e_pro_pa.pa_id=1 "; //実行する
ResultSet rs1 = st1.executeQuery(sql1);

//b2の値を求める
Statement st2 = conn.createStatement();
String sql2 = "select kosu * cadk as b2 FROM e_pro_pa,ca_shouhisha where e_pro_pa.pa_id=2 "; //実行する
ResultSet rs2 = st2.executeQuery(sql2);

//b3の値を求める
Statement st3 = conn.createStatement();
String sql3 = "select kosu * cadk as b3 FROM e_pro_pa,ca_shouhisha where e_pro_pa.pa_id=3 "; //実行する
ResultSet rs3 = st3.executeQuery(sql3);
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-07-08 21:56
これでは、jasonさんが何をやりたいのかさっぱりわかりません。

まず、このままでも1本のプログラムです。何をどうまとめたいのかがわかりません。

また、前後関係もこのプログラムの目的も分からないのでは、仮にどうまとめたいのかがわかっても、どのようにまとめていいのかわかりません。

もうすこし、やりたいことを整理してもらえませんか?
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-07-09 01:19
jasonさん、こんにちは。

質問の仕方、なんだかな〜と私も思いましたが、頑張って答えてみ
ようと思います。

まず、繰り返し処理を1つのメソッドにしてしまいます。
(ちょっと幼稚な部分がありますが、)
コード:
ResultSet query(int n) {
	Statement st = conn.createStatement();
	String sql = "select kosu * cadk as b" + n +
		"FROM e_pro_pa,ca_shouhisha where e_pro_pa.pa_id=" + n +
		" ";
	ResultSet rs = st.executeQuery(sql);
}


呼び出し側で引き数を指定して必要な分、呼び出せばいいと思います。

ただし、この方式ではクエリの文字列 sql を毎回生成し直すことになり、
無駄ですから(それに格好悪いので)、conn.prepareStatement() して、
PreparedStatementを作っておいて再利用するのが良いでしょう。
パラメタを ? で書いておいて、使うたびに setInt() 等してやれば
statementを再利用できます。
未記入
大ベテラン
会議室デビュー日: 2003/11/24
投稿数: 121
投稿日時: 2004-07-09 08:16
ひとつにまとめる目的が実行効率であれば、SQL をひとつにまとめて、
結果セットの取得を一度にするが良いのではないかと思います。

今回の場合は、Case で分岐して列を増やす、または Union を使用して
行を増やす、という方法が採れます。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-07-09 11:27
どなたも指摘されていませんので、いちおうひと言。
投稿のタイトルには抱えている課題を分かりやすく説明するひと言を使う
ようにしましょうよ。

※「初めて投稿します!」だと、何が問題で何が知りたいのか、良く分からないですよ。
jason
会議室デビュー日: 2004/07/08
投稿数: 16
投稿日時: 2004-07-09 16:15
質問の仕方がまだよく分かっていませんでした。すいません。
今やろうとしているプログラムは、環境JSPで製品の増加を行うことです。先日メールで載せたプログラムは1つの製品を3つの部品で作るというプログラムでした。そのプログラムは製品に対して1つ1つプログラムで書かなければなりませんでした。製品がもっと増加したときに1つずつプログラムを書いていたのでは時間がかかりすぎるということで、製品が増えても対応できるようなプログラムを考えています。(例:for文などを使う) 現在の課題は5製品10部品30原料に拡張することです。先日メールで載せたプログラムは1製品3部品6原料です。
返信をくれた皆様には感謝しています!参考にします!!

[ メッセージ編集済み 編集者: jason 編集日時 2004-07-09 16:32 ]

[ メッセージ編集済み 編集者: jason 編集日時 2004-07-09 16:48 ]
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2004-07-09 21:44
ひょっとして学校の宿題ですかね?

とりあえず1つだけ。
kosu * cadk as b1 としてますが、b1とかb2とかする(変更していく)必要があるのでしょうか?
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2004-07-10 04:16
私からももう一つ。

最初に示されたプログラムのどこが製品でどこが部品でどこが原料に対応するのか全然わからないのですが。

あと、これはもう少し先の問題かもしれませんが、他の方も指摘されている通り、
(1) 同じような SQL を複数回発行してその度に DBMS に実行計画を立てさせている
(2) 間に更新を挟んでいないので二つのテーブルの内容は変わっていないと思われるのに、単純結合を何回も行う
の二点で効率が悪いですね。
後者は DBMS がキャッシュしていてくれるかもしれませんが、それを前提にすべきではないと思います。

「単純結合」はあまり専門用語らしくありませんが、データベース操作では重要な用語の一つです。ご存知でなければ、どういう意味で、それにより DBMS がどういう処理を行うかを調べておくと、後々役立つと思います。

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