MySQL - 存储过程SQL中的错误1064

时间:2013-03-01 01:18:29

标签: mysql sql

我编写了以下存储过程,HeidiSQL在SET pay_ref = SELECT CONCAT('KOS' ...

开头的行中给了我错误1064

首先让我解释一下这个程序是怎么回事。我有一个表gamers,带有一个带有auto_increment的BIGINT主键。这个过程应该是:

  1. 从用户那里获取一些参数
  2. 根据他/她的电子邮件地址检查用户是否已存在于数据库中,如果存在reord,则回吐“DUPLICATE”一词
  3. 否则它会正常插入
  4. 然后它读入创建的新记录的ID并将其转换为varchar,用前导零填充它,然后与其他字符串连接
  5. 这个新字符串(例如应该读取KOS00001ABCDEF)然后会更新为pay_refcode字段>>>这就是我们如何确定为用户生成唯一的付款参考
  6. 如果一切正常,它会使用新生成的参考代码更新retval以供PHP脚本读取。

  7. DELIMITER //
    CREATE PROCEDURE `InsertGamer` (
        IN p_fname          VARCHAR(30),
        IN p_lname          VARCHAR(30),
        IN p_email          VARCHAR(255),
        IN p_favgame        VARCHAR(60),
        IN p_pay_suffix     VARCHAR(6),
        OUT retval          VARCHAR(14)
    )
    BEGIN
        DECLARE last_id BIGINT;
        DECLARE pay_ref VARCHAR(14);
    
        IF (EXISTS(SELECT * FROM gamers WHERE (email = p_email))) THEN
            SET retval = 'DUPLICATE';
        ELSE
            INSERT INTO gamers (fname, lname, email, favgame, pay_refcode)
            VALUES (p_fname, p_lname, p_email, p_favgame, NULL);
            SET last_id = LAST_INSERT_ID();
            SET pay_ref = SELECT CONCAT('KOS', (SELECT LPAD(CONVERT(last_id, VARCHAR(5)),5,'0')), p_pay_suffix);
    
            UPDATE gamers
            SET pay_refcode = pay_ref
            WHERE application_id = last_id;
    
            SET retval = pay_ref;           
        END IF;
    END //
    

    我不能为我的生活弄清楚问题是什么,并真诚地感谢你的任何帮助。非常感谢你提前!

1 个答案:

答案 0 :(得分:1)

您只需要从为SELECT设置值的行中删除pay_ref关键字。

SET pay_ref = CONCAT('KOS', LPAD(CONVERT(last_id, CHAR(5)),5,'0'), p_pay_suffix);

完整代码:

DELIMITER //
CREATE PROCEDURE `InsertGamer` (
    IN p_fname          VARCHAR(30),
    IN p_lname          VARCHAR(30),
    IN p_email          VARCHAR(255),
    IN p_favgame        VARCHAR(60),
    IN p_pay_suffix     VARCHAR(6),
    OUT retval          VARCHAR(14)
)
BEGIN
    DECLARE last_id BIGINT;
    DECLARE pay_ref VARCHAR(14);

    SET @count := (SELECT COUNT(*) FROM gamers WHERE email = p_email)
    IF (@count > 0) THEN
        SET retval = 'DUPLICATE';
    ELSE
        INSERT INTO gamers (fname, lname, email, favgame, pay_refcode)
        VALUES (p_fname, p_lname, p_email, p_favgame, NULL);

        SET last_id = LAST_INSERT_ID();

        SET pay_ref = CONCAT('KOS', LPAD(CONVERT(last_id, CHAR(5)),5,'0'), p_pay_suffix);

        UPDATE gamers
        SET pay_refcode = pay_ref
        WHERE application_id = last_id;

        SET retval = pay_ref;           
    END IF;
END //
DELIMITER ;