2012-01-26 5 views
1

次のコードは、MySQLクライアント内で実行されるか、mysqlにパイプされて実行されます。私はJavaの 内部クエリとしてそれを実行しようとすると、私は、SQL文の実行エラーJava内からクエリを実行して関数を作成する

エラー com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException取得する:あなたは、あなたのSQL構文でエラーが発生しているが、あなたのMySQLサーバのバージョンに対応するマニュアルをチェックし、正しい構文が「デリミタ@」の近くで使用するようにしてください。

これは私が問題を抱えていた最初のクエリです。私はラインフィードを1行のステートメントとして実行するスペースで置き換えようとしましたが、Javaではなくどこでも動作しました。 DROPステートメントがなくても同じ問題が試されます。

エラーコード1064(解析エラー)、国家あなたが提供することができます任意の助け42000

感謝。


DROP FUNCTION IF EXISTS escape_query_result; 

delimiter @ 

CREATE FUNCTION escape_query_result(label CHAR(255)) 
    RETURNS CHAR(255) 
BEGIN 
    RETURN (REPLACE(REPLACE(REPLACE(label, "\\", "\\\\"), "|", "\\|"), "=", "\\=")); 
[email protected] 

delimiter ; 

私は私の質問を編集して、答えを投稿することができないので:

は私の答えを見つけました。

http://bugs.mysql.com/bug.php?id=25019

クエリから区切り文字を変更することはできません。区切り文字なしで実行すると呼び出しが機能しました。

+0

更新プログラムではなくクエリとして扱っている場合、それが問題になる可能性があります。また、準備されたステートメントを見てくださいhttp://www.exampledepot.com/egs/java.sql/InsertPs.html – Max

+0

あなたは実際に自分の質問の答えを投稿することができます。 (それはあなたがそれをやめているのですか?) –

答えて

0

あなたのMySQL接続文字列では、allowMultiQueriesをtrueに設定する必要があります。それ以外の場合は、複数のステートメントをセミコロンで結合したクエリをMySQLに送信するとエラーになります。ここではドキュメントを参照してください:

http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html

allowMultiQueriesのデフォルト設定はfalseです。

ただし、これをfalseに設定するとセキュリティ上の理由から実際に便利です。ほとんどのSQLインジェクション攻撃は、クエリにセミコロンを挿入することで機能します。 allowMultiQueriesがfalseの場合、これらの注入は、テーブルのいずれかの行をすべて削除するのではなく、エラーを発生させます。この状況では、DROPを別のクエリとして送信するほうがよい場合があります。

しかし、これがMySQLのDELIMITERコマンドとどのように相互作用するかはわかりません。私は今すぐテストする時間がないので、他の誰かがそれを手伝ってくれるかもしれません。

+0

私はテーブル(...)への挿入(...);テーブルへの挿入(...)VALUESストアドプロシージャや関数を作成することはできません。 – Christopher

関連する問題