繁体   English   中英

MySQL CREATE PROCEDURE语法错误

[英]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例程语句组成。 这可以是简单的语句(例如SELECTINSERT ,也可以是使用BEGINEND编写的复合语句。 复合语句可以包含声明,循环和其他控制结构语句。 这些语句的语法在第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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM