MYSQL中的嵌套存储过程有错误

时间:2013-09-22 07:17:25

标签: mysql sql stored-procedures

所以我有这个存储过程,我试着写一些不同的方法,但都无济于事。

CREATE PROCEDURE `CreateHero`
(IN USER_EMAIL VARCHAR(40), IN NAME VARCHAR(16), IN GENDER VARCHAR(6))
BEGIN
    INSERT INTO HEROES (USER_ID, NAME, GENDER) 
VALUES 
((CALL GetUserId(USER_EMAIL)), NAME, GENDER);
END

我收到此错误

  

#1064 - 您的SQL语法出错;查看与您的MySQL服务器版本对应的手册,以便在第6行的'CALL GetUserId(USER_EMAIL)),NAME,GENDER'附近使用正确的语法

我试过修补一段时间。

GetUserId有效。我试图将结果存储在一个临时变量中,然后插入它但不起作用。

不要无耻但是如果您可以确定解决方案,那么将CALL GetUserId存储在变量中的解决方案将是最佳选择。

2 个答案:

答案 0 :(得分:3)

你不能这样使用它。使用GetUserId参数重写OUT程序。

这样的事情:

DELIMITER $$
CREATE PROCEDURE GetUserId(IN p_email varchar(20), OUT p_id int)
BEGIN
    SELECT id INTO p_id FROM users where email = p_email;
    /*or whatever your procedure does*/
END$$
DELIMITER ;

然后您的程序CreateHero将如下所示:

DELIMITER $$
CREATE PROCEDURE `CreateHero`
(IN USER_EMAIL VARCHAR(40), IN NAME VARCHAR(16), IN GENDER VARCHAR(6))
BEGIN
    DECLARE v_id int;
    CALL GetUserId(USER_EMAIL, v_id);
    INSERT INTO HEROES (USER_ID, NAME, GENDER) 
    VALUES 
    (v_id, NAME, GENDER);
END$$
DELIMITER ;

答案 1 :(得分:1)

旧线程但可以帮助一些人寻找以后...... 基于fancyPants答案,但更美丽如下:

 DELIMITER $$
    CREATE FUNCTION GetUserId(IN p_email varchar(20)) RETURNS int
    BEGIN
        RETURN(SELECT id FROM users where email = p_email);
        /*or whatever your function does*/
    END$$
    DELIMITER ;

然后:

DELIMITER $$
CREATE PROCEDURE `CreateHero` (IN USER_EMAIL VARCHAR(40),
    IN NAME VARCHAR(16), IN GENDER VARCHAR(6))
BEGIN
    INSERT INTO HEROES (USER_ID, NAME, GENDER) 
        VALUES (GetUserId(USER_EMAIL), NAME, GENDER);
END$$
DELIMITER ;