2016-11-07 79 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行是空的,那麼它怎麼可能有語法錯誤?

+0

你忘了分隔符。在此處查看示例http://stackoverflow.com/a/40467504/575376 –

回答

2

由於MySQL docs

如果您使用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