2016-09-13 15 views
0

ここには、私が実際の目的のために作成している単純な関数があります。しかし、与えられたエラーを受け取ります。この単純な関数は何が間違っていますか?

DELIMITER $$ 

CREATE FUNCTION Weighted_Average(n1 INT, n2 INT, n3 INT, n4 INT) 
RETURNS INT 
DETERMINISTIC 
BEGIN 
    DECLARE avg INT; 
    SET avg = (n1 + n2 + n3*2 + n4*4)/8; 
    RETURN avg; 
END; 
DELIMITER $$ 

エラーコード:1064。SQL構文にエラーがあります。正しい構文が 'n4 * 4)/ 8'の近くで使用されるようにMySQLサーバのバージョンに対応するマニュアルを確認してください。 RETURN avg;ライン6

でEND」私はこの記事にそれを比較しています:私はどこを取得していないのですながら経験を持つ

MySQL CREATE FUNCTION Syntax

誰かが、おそらく私のミスを指摘することができます。私はエラーが私に見せてくれる場所が間違っているのを見ない。注:私はワークベンチを使用しています。

+3

私はそれをテストし、正常に機能を作成します。エラーは再現できません。私は、あなたが環境やコードについて私たちに言っていないことがあると思います。 –

+1

ちょうどメモ:あなたの2番目の 'DELIMITER'ステートメントは、デフォルトの'; 'に戻すことになっています。 –

+1

区切り文を除いて、これはSQL Fiddle上でうまく動作します。http://www.sqlfiddle.com/#!9/4adc3c。 –

答えて

0

あなたは本当に以下を意味するものではありませんか、主にその底部ですか?いくつかのクライアント側の環境はブロックの始まりと終わりを描写するために、およびステートメントのためのエンド・オブ・ラインを変更するため

DROP FUNCTION IF EXISTS Weighted_Average; 
DELIMITER $$ 
CREATE FUNCTION Weighted_Average(n1 INT, n2 INT, n3 INT, n4 INT) 
RETURNS INT 
DETERMINISTIC 
BEGIN 
    DECLARE avg INT; 
    SET avg = (n1 + n2 + n3*2 + n4*4)/8; 
    RETURN avg; 
END;$$ 
DELIMITER ; 

DELIMITERが必要です。

DELIMITERはデフォルトで;にデフォルト設定されているため、SQLラインをどのように終了するのかはわかりません。

それはCREATE PROCEDUREFUNCTIONEVENTTRIGGERのような特殊なブロックになると...までは、全部が終了する場所を知るためにいくつかのクライアントのためのプロトコルおよびサーバーが必要です。

したがって、MySQL Workbenchなどのクライアントでは、DELIMITERブロックを使用します。私たちはこれを何か面白いものに変え、いつものようにコードし、上記のように結末を行います。 DELIMITERを通常の;に設定する

PHPMyAdminでは必要ありません。おそらくそうではありません。SqlFiddle

+0

DELIMITERが何であるのか分かっていれば気分が良くなりますし、$$記号をとりENDの後に入力すると何が起こっているのでしょうか? – Bhail

関連する問題