2016-11-07 12 views
0

MySQLデータベースのストアドファンクションを更新しようとしています。アップデートは複数のデバイスにリリースされるので、私はupdate.sqlファイルを通してそれをやっています。MySQL - CREATE DEFINER構文エラー

は、ここでそれはちょうどこの機能を使用するレポートが正常に生成しなかったことをテストチームによって私に報告された機能

DROP FUNCTION `STAFF_MPT`; 
CREATE DEFINER=`jelena`@`%` FUNCTION `STAFF_MPT`(`par_stocktake_staff_id`  INT) RETURNS DECIMAL(20,0) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN 

DECLARE proc_total INT; 
DECLARE proc_time INT; 

SET proc_total = (SELECT SUM(quantity) FROM stocktake_scans WHERE stocktake_staff_id = par_stocktake_staff_id); 

SET proc_time = (SELECT TIMESTAMPDIFF(SECOND , MIN(scan_date) , MAX(scan_date)) AS area_time 
    FROM stocktake_scans 
    WHERE stocktake_staff_id = par_stocktake_staff_id 
    ); 

RETURN (proc_total/proc_time)*3600; 

END 

です。私はPMAのSQLクエリウィンドウでコードを実行しようとしたが、次のを持っていた:

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 3 

誰かが私に行方不明を教えてくれる?これによると、3行目は空ですので、どうすれば構文エラーが発生する可能性がありますか? MySQL docsのよう

+0

あなたは区切り文字を忘れてしまいました。ここの例を見てくださいhttp://stackoverflow.com/a/40467504/575376 –

答えて

2

あなたはセミコロン文字を含む格納されたプログラムを定義するためのMySQLクライアントプログラムを使用している場合は、問題が発生します。デフォルトでは、mysqlはセミコロンを文の区切り文字として認識します。したがって、mysqlが格納されたプログラム定義全体をサーバに渡すように、区切り文字を一時的に再定義する必要があります。

mysqlデリミタを再定義するには、delimiterコマンドを使用します。

@juergen_dはコメントで示唆:あなたは、区切り文字で、あなたの手順を定義する必要があります。

DROP FUNCTION `STAFF_MPT`; 

delimiter || 

CREATE DEFINER=`jelena`@`%` FUNCTION `STAFF_MPT`(`par_stocktake_staff_id`  INT) RETURNS DECIMAL(20,0) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN 

DECLARE proc_total INT; 
DECLARE proc_time INT; 

SET proc_total = (SELECT SUM(quantity) FROM stocktake_scans WHERE stocktake_staff_id = par_stocktake_staff_id); 

SET proc_time = (SELECT TIMESTAMPDIFF(SECOND , MIN(scan_date) , MAX(scan_date)) AS area_time 
    FROM stocktake_scans 
    WHERE stocktake_staff_id = par_stocktake_staff_id 
    ); 

RETURN (proc_total/proc_time)*3600; 

END 

|| 
delimiter ; 
+0

ありがとう!私は区切り文字をドロップ関数の部分の後に置かなければなりませんでしたが、今は動作します:) – ArtleMaks

+0

ああ、そうです、それは 'drop'呼び出しの後になければなりませんでした。それを私が直した。 –

+0

私は今、気が散っていますが、ここではスペースを区切っています。答えは101%です – ArtleMaks