2016-11-07 350 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