[英]MySQL CREATE PROCEDURE syntax error
我已经尝试过我能想到的所有可能的组合来解决此错误,但是这种情况一直在发生。 任何帮助表示赞赏。 这只是修改sakila
示例数据库以执行更复杂的操作。
看到底部,我用-- HERE!
标记了错误-- HERE!
。
USE sakila;
DROP PROCEDURE IF EXISTS sp_randCustMult;
DELIMITER //
CREATE PROCEDURE sp_randCustMult()
BEGIN
/* section of code left out for troubleshooting
IF EXISTS (SELECT * FROM information_schema.columns WHERE table_name = customer AND column_name = multiplier)
THEN ALTER TABLE customer DROP COLUMN multiplier;
IF EXISTS (SELECT * FROM information_schema.columns WHERE table_name = customer AND column_name = cust_ranking)
THEN ALTER TABLE customer DROP COLUMN cust_ranking;
END IF;
*/
-- add new columns
ALTER TABLE customer
ADD COLUMN multiplier DECIMAL(3,2) AFTER active;
/* this column not relevant now
ALTER TABLE customer
ADD COLUMN cust_ranking VARCHAR(10) AFTER multiplier;
*/
-- declare a counter
SET @start = (SELECT MIN(customer_id) FROM customer);
SET @stop = (SELECT MAX(customer_id) FROM customer);
-- start while loop
WHILE @start <= @stop
DO
UPDATE customer
-- insert multiplier based on random distribution
SET multiplier =
(SELECT
(CASE
WHEN RAND() <= 0.65 THEN 1.00
WHEN RAND() <= 0.90 THEN 0.85
WHEN RAND() <= 1.00 THEN 1.05
END)
)
WHERE customer_id = @start;
-- tick counter one up
SET @start = @start + 1;
END WHILE;
-- HERE! syntax error on END before //
END//
DROP PROCEDURE sp_randCustMult//
DELIMITER ;
EDIT1 :澄清一下 ,MySql版本是:
MySQL Workbench Community (GPL) for Mac OS X version 6.1.4 revision 11773 build 1454
以及来自Workbench的错误响应:
Error Code: 1064. 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 'END' at line 35
EDIT2 :根据建议编辑代码。 错误不再发生,但是数据根本没有更新。 (新列中的所有NULL
)
您的CREATE PROCEDURE
与MySQL手册中所述的所需语法不匹配(以下仅包括相关部分进行了简化):
CREATE
PROCEDURE
sp_name ([ proc_parameter [,...]])routine_body
例程主体 :
有效的SQL例程语句
Routine_Body由有效的SQL例程语句组成。 这可以是简单的语句(例如
SELECT
或INSERT
,也可以是使用BEGIN
和END
编写的复合语句。 复合语句可以包含声明,循环和其他控制结构语句。 这些语句的语法在第13.6节“ MySQL复合语句语法”中进行了描述 。
因此,这个垃圾...
IF EXISTS (SELECT * FROM information_schema.columns WHERE table_name = customer AND column_name = multiplier)
THEN ALTER TABLE customer DROP COLUMN multiplier;
IF EXISTS (SELECT * FROM information_schema.columns WHERE table_name = customer AND column_name = cust_ranking)
THEN ALTER TABLE customer DROP COLUMN cust_ranking;
END IF;
……是非法的。 也许您打算将其移至BEGIN … END
复合语句中?
在END WHILE
之后,您还需要使用分号。
所有功能逻辑必须在标签BEGIN和END之间
因此,IF条件和alter query的内容必须位于过程的BEGIN和END标签之间。
谢谢
我发现了问题,这是CR上的解决方案: https : //codereview.stackexchange.com/questions/51603/mysql-modifying-sakila-database
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.