2011-06-28 13 views
0

私は5.1.39に私のMySQLサーバのアップグレードをしたし、今私は(以前に働いていた)SQLスクリプトを実行するとき - それは、エラーがスローされます。私は何度も構文をチェックしており、互換性のないコード部分を見つけることができませんでした。この問題の解決策を提案してください。のMySQL 5.1.39 SQL構文エラー

エラーメッセージ

Mysql::Error: 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 'CREATE FUNCTION clean_dymmy_table (dummy_name VARCHAR(255)) RETURNS V' at line 3:

SQLコード:区切り文字の一部を削除したが、私は後ろにいることを追加したときに、それが正常に動作する理由

/*DELIMITER //*/ 
DROP FUNCTION IF EXISTS clean_dymmy_table; 
CREATE FUNCTION clean_dymmy_table (dummy_name VARCHAR(255)) RETURNS VARCHAR(255) 
DETERMINISTIC 
BEGIN 
    DECLARE temp_val VARCHAR(255); 
    SET temp_val = dummy_name; 

    -- Test 
    SET temp_val = REPLACE(temp_val, 'Tmp ', ''); 
    SET temp_val = REPLACE(temp_val, ' TmP', ''); 
    SET temp_val = REPLACE(temp_val, 'TMP ', ''); 
    SET temp_val = REPLACE(temp_val, ' TMP', ''); 
    SET temp_val = REPLACE(temp_val, ' tmp', ''); 

    RETURN dummy_name; 
END/*//*/ 
+0

エラーメッセージが、指定されたSQLコードと一致しません。 –

+0

これには関係がありますか? http://bugs.mysql.com/bug.php?id=46429 – pinkgothic

答えて

0

勘は:

  • #46429使用delimiterコマンドを
MySql.Data.MySqlClient.MySqlScriptに:ここであなたをかむかもしれ DELIMITERに関する5.1.xのラインでのMySQLのバグがあるようですそれは重く cwallenpoole's response与え、あなたがそれを呼んでいるかにもよるが

することは、あなたの症状は、それはよくあなたのMySQLバージョン与えられ、そのバグかもしれ示唆ありません。あなたの可能性をアップグレードしていますか?

+0

より良い方法はアップグレードしないことです。どのような提案がありますか、どのように私はコード内のDELIMITERステートメントを取り除くためにSQLコードをリファクタリングできますか? – thesis

+0

残念ながら、私はSQLプロシージャーを使ったことがありません。しかし、バグを正しく理解していれば、mysql *クライアント*からコードを呼び出すことで 'DELIMITER'を使うことができます。そのリンクで** Valeriy Kravchuk **のコメントをチェックしてください。 – pinkgothic

1

わからない:

DELIMITER // -- you have to change what MySQL expects between commands 
DROP FUNCTION IF EXISTS clean_dymmy_table // -- tell it a new command's coming 
CREATE FUNCTION clean_dymmy_table (dummy_name VARCHAR(255)) 
            RETURNS VARCHAR(255) 
DETERMINISTIC 
BEGIN 
    -- now this can be parsed as part of the current command. 
    DECLARE temp_val VARCHAR(255); 
    SET temp_val = dummy_name; 

    -- Test 
    RETURN dummy_name; 
END 
// -- Now you're done with that command. 
-- go back to semi-colons, because otherwise life is too zany for me. 
DELIMITER ; 

(これは5.1.54にあった...しかし、私はそれは問題べきではないと思う)

+0

私はこれにコードを変更しました: 'DELIMITER // もし存在すれば削除機能clean_dymmy_table // CREATE FUNCTION clean_dymmy_table(dummy_name VARCHAR(255)) RETURNS VARCHAR(255) DETERMINISTIC は DECLAREのtemp_val VARCHAR(255)BEGIN; SET temp_val = dummy_name; RETURN temp_val; END // DELIMITER ; 'しかし、今では同じエラー' MySQLの::エラーをスロー:あなたのSQL構文でエラーが発生しています。 'DELIMITER // が存在する場合は削除機能clean_dymmy_table // 1行目で関数' cを作成する ' – thesis

+0

文字通り上記をコピー&ペーストするとどうなりますか?スクリプトを評価する何か? (MySQLのブラウザではこれがスクリプトの下にありますが、それは通常のクエリではありません) – cwallenpoole