- PR -

計算結果の自動保存のやり方について

投稿者投稿内容
のび太
会議室デビュー日: 2004/03/13
投稿数: 10
投稿日時: 2004-04-07 12:32
JSPでMySQLのデータベースであるテーブルAのデータを読んできて計算し、その結果をテーブルBに保存したいと思っています。

テーブルAとBは次のようになっています。

<テーブルA>

NO a b c
---------------------------
1 2 3 2
2 4 5 1
3 3 7 8


<テーブルB>

NO goukei
----------------
1 0
2 0
3 0

下のように、このテーブルAのそれぞれのa+b+cの計算結果をテーブルBの合計のところに上書き保存するようにしたいです。


<テーブルB>

NO goukei
----------------
1 7
2 10
3 18


実際にはテーブルAを表示させて、「計算」というボタンを押したら合計の値が表示されて保存もされるという感じにしたいです。
今のところ「計算」ボタンを押したら計算結果は表示されるのですが、
きちんと保存されません。
よろしくお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-04-07 13:22
SELECT文の後にINSERT文を実行すればよろしいのでは。
やりたいことがわかっているのであれば、それをやるだけだと思います。

ソースがないので、
・実行しようとしているがうまくいかない
・そもそも実行していない
のどちらかわかりません。

実行しようとしているがうまくいかないのであれば、
エラーの詳細(例外のトレース)も書き込むべきだと思います。
のび太
会議室デビュー日: 2004/03/13
投稿数: 10
投稿日時: 2004-04-07 13:44
かつのりさん、ありがとうございます。

---------------------------
ソースがないので、
・実行しようとしているがうまくいかない
・そもそも実行していない
のどちらかわかりません。
---------------------------

実行しようとしているのですがうまくいきません。
しかもエラーはありません。
計算結果はでるのですが保存されていない状態です。

私は保存のところをUPDATE文で書いているのでINSERT文に変えて実行してみたいと思います。
Goki
会議室デビュー日: 2004/03/02
投稿数: 16
投稿日時: 2004-04-07 14:05
MySQLの場合はどうなのかわかりませんが、
PostgresSQLの場合では、データベース上のデータ
をいじる時は、コミットしないと駄目でした。
(自動コミットを立てていれば話は別ですが)

何かの参考になれば・・。

MySQL+コミットで検索してみた所
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/php_s03.htm

[ メッセージ編集済み 編集者: Goki 編集日時 2004-04-07 14:07 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-04-07 14:18
上書きだからINSERTではなくUPDATEですね。
勘違いしてました。。。
Gokiさん同様オートコミットが気になります。
オートコミットの設定はどうなっていますか?
Connection#getAutoCommit()の値を見てみてください。

ちなみにUPDATEして、エラーにならず更新されていない場合によくあるのが、
・抽出条件が更新対象に存在しない(0件更新)
・オートコミットではない状態で更新し、コミットせずに終了してロールバック
です。

SQLを別で実行(MySQL用ツール等)して、更新が行われていますか?
のび太
会議室デビュー日: 2004/03/13
投稿数: 10
投稿日時: 2004-04-07 15:05
Gokiさん、かつのりさんありがとうございます。

---------------------------------------------------
オートコミットの設定はどうなっていますか?
Connection#getAutoCommit()の値を見てみてください。
---------------------------------------------------

オートコミットの設定はしていませんでした。
さっそく参考にしてやってみます。

----------------------------------------------------------------
SQLを別で実行(MySQL用ツール等)して、更新が行われていますか?
----------------------------------------------------------------

SQLは別で実行して更新はできています。
のび太
会議室デビュー日: 2004/03/13
投稿数: 10
投稿日時: 2004-04-07 19:25
オートコミットの設定をしてみましたが、うまく保存されません。
WHERE no = " + no + "のところでそれぞれのデータを保存するときにおかしくなっているのでしょうか??
アドバイスお願いします。

以下にソースを示します。
--------------------------------------------
if (request.getMethod().equals("POST")) {
try {
//追加するデータを取得する
int no = Integer.parseInt(request.getParameter("no"));
int goukei = Integer.parseInt(request.getParameter("goukei"));

//自動コミットモードを解除します
conn.setAutoCommit(false);

//在庫を確認する
Statement st = conn.createStatement();
String sql ="SELECT a + b + c as b1 FROM tableA WHERE no = " + no + "";
ResultSet rs = st.executeQuery(sql);
rs.next();
int b1 =rs.getInt("b1");

//データを追加する

sql = "UPDATE tableB SET "
+ " goukei = " + b1
+ " WHERE no = " + no + "";
st.addBatch(sql);
st.executeBatch();

// コミットします
conn.commit();
out.println("データを追加しました");

}
catch (Exception e) {
out.println("データ追加エラー"+e);
try {

// ロールバックします
conn.rollback();
} catch (SQLException ex) {
e.printStackTrace();
}
}
}
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-04-07 20:16
ここに来ているのでしょうか?
conn.commit();
out.println("データを追加しました");

また、
st.executeBatch();
と、
Connection#isReadOnlyの戻り値を教えてください。

MySQLはよくわからないのですが、
別プロセスでテーブルに対して
トランザクションを張っていたりしていないですか?
そういう時もDBによりますが、
更新が正常っぽく行われているのに
セレクトすると更新されてないということもあります。

こういった障害は実際の開発でよく起こりうるので、
コネクションの生成方法・現在状態の確認や、他の実行プロセスの確認等の
障害対策を覚えていたほうがよいかと思います。

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