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/