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/