我已经尝试了所有可能的组合,我可以想到解决这个错误,但它一直在发生。任何帮助赞赏。这只是修改sakila
示例数据库以执行更复杂的操作。
查看底部我用-- 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
)
答案 0 :(得分:1)
您的CREATE PROCEDURE
与所需的语法as described in the MySQL manual不符(以下简要介绍相关部分):
CREATE
PROCEDURE
sp_name ([ proc_parameter [,...]])
routine_body
routine_body :
有效的SQL例程语句
routine_body 由有效的SQL例程语句组成。这可以是简单的语句,例如
SELECT
或INSERT
,也可以是使用BEGIN
和END
编写的复合语句。复合语句可以包含声明,循环和其他控制结构语句。 Section 13.6, “MySQL Compound-Statement Syntax”中描述了这些语句的语法。
因此,这个垃圾......
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
之后你还需要一个分号。
答案 1 :(得分:0)
所有功能逻辑必须位于标签BEGIN和END
之间因此,IF条件和更改查询内容必须位于过程的BEGIN和END标记之间。
由于
答案 2 :(得分:0)