MySQL CREATE PROCEDURE语法错误

时间:2014-05-24 04:35:08

标签: mysql

我已经尝试了所有可能的组合,我可以想到解决这个错误,但它一直在发生。任何帮助赞赏。这只是修改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

3 个答案:

答案 0 :(得分:1)

您的CREATE PROCEDURE与所需的语法as described in the MySQL manual不符(以下简要介绍相关部分):

  
    

CREATE
        PROCEDURE sp_name ([ proc_parameter [,...]])
         routine_body

         

routine_body
         有效的SQL例程语句

  
     

routine_body 由有效的SQL例程语句组成。这可以是简单的语句,例如SELECTINSERT,也可以是使用BEGINEND编写的复合语句。复合语句可以包含声明,循环和其他控制结构语句。 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)

相关问题