[前][次][番号順一覧][スレッド一覧]

mysql:7667

From: くろ たろう <くろ たろう <kuro_taro_aki@xxxxxxxxxx>>
Date: Wed, 7 May 2003 19:31:49 +0900 (JST)
Subject: [mysql 07667] <JDBC> クエリーで関数を使うには?

くろたろうです。Kenさん、宇野さん。ご返答有難うございま
す。宇野さんの回答どおり変更すると、正常に動作致しました
。質問の不備を深くお詫びします。mysqlクライアントで正常
に動作することを書かなかったり、Statement作成部分のソー
スを抜いたり、正に素人判断でした。にも関わらず、時間を割
いて調べてまで正確な返答をしてくださり、本当に感謝してい
ます。さらに精進いたします。本当にありがとうございました
。以下に、問題点と、解決までの経緯を記載させて頂きます。

<問題点>
以下のソースでSQL実行結果を出力すると、
1:select tan_odds from master where raceNo=1;
は正常に実行できるが、
2:select sum(tan_odds) from master where raceNo=1;
では、シンタックスエラーが発生する。

<ソース>
try{
  //ドライバの設定
  Class.forName("gwe.sql.gweMysqlDriver").newInstance();
  //DB接続
  Connection con = DriverManager.getConnection(
   
"jdbc:mysql://localhost/db1?useUnicode=true&characterEncoding=SJIS",
"***", "***");
  //statementの作成
  Statement stmt = con.createStatement(   
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
  //問題のSQL文です。この内容を上記1,2に変更します
  String sql = new String("select sum(tan_odds) from
master where raceNo=1;");
  //ResultSetの取得
  ResultSet rset = stmt.executeQuery(sql);
  //結果の取得と表示
  while(rset.next()){
    float odds_sum = rset.getFloat(1);
    System.out.println("odds_sum:" + odds_sum);
  }
}catch(Exception e){
  e.printStackTrace();
}

<関数を使用した時に発生するエラー>
java.sql.SQLException: mysql exception: (You have an
error in your SQL syntax. Check the manual that
corresponds to your MySQL server version for the right
syntax to use near '' at line 1
        at gwe.sql.gweMysqlConnection.executeQuery(Unknown
Source)
        at gwe.sql.gweMysqlStatement.executeQuery(Unknown
Source)
        at
gwe.sql.gweMysqlDatabaseMetaData.getPrimaryKeys(Unknown
Source)
        at gwe.sql.gweMysqlResultSetBuffer.<init>(Unknown
Source)
        at gwe.sql.gweMysqlStatement.executeQuery(Unknown
Source)
        at Test.<init>(Test.java:14)
        at Test.main(Test.java:25)
mysql can not get ResultSet and MetaData!! : mysql
exception: (You have an error in your SQL syntax.  Check
the manual that corresponds to your MySQL server version
for the right syntax to use near '' at line 1
odds_sum:2.0

<解決方法>
createStatementの引数をConcur_UPDATABLEからConcur_READ_ONLY
に変更すると、正常に動作しました。理由と詳細は下記に宇野
さんから頂いたメールの解説を記載致します。

→ 多分、createStatementのときにresultSetConcurrencyに渡
す値を間違えてると思います。ResultSet.CONCUR_UPDATABLEを
指定してませんか? ResultSet.CONCUR_READ_ONLYを指定して
ください。
 select * from master; が返す結果は実テーブルなので更新
可能です。なのでResultSet.CONCUR_UPDATABLEでCreateStatement
してもOKです。
 一方、select sum(tan_odds) from master;が返す結果は実は
テーブルではないので更新不可能です。なのでこの場合はResultSet.CONCUR_READ_ONLY
を指定してcreateStatementしなければなりません。
 この指定が間違っていると、アップデート操作に備えて、実
テーブル名がないのにgweMysql内部で結果セットのプライマリ
キーを取得するために内部クエリー(SHOW KEYS FROM文)を発行
し、そのクエリーがsyntax errorを起こします。

(最後に)
余談です。読み飛ばして下さい。MLを始めて数ヶ月たちました
が、今ではもう手放せない大事なものになってしまいました。
プログラム作成時に本当に行き詰ってしまうと、僕のような始
めたばかりの個人プログラマにはもうML以外に頼る術がありま
せん。これは本当にすばらしいシステムであると心から感謝し
ています。いずれは、自分も返答できる側になれるように頑張
ります。運営者の皆様、そしていつも丁寧なご返答を下さる皆
様、本当に有難うございます。m(__)m感謝。


__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!
http://bb.yahoo.co.jp/


[前][次][番号順一覧][スレッド一覧]