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

MYSQL中的嵌套存储过程有错误,mysql,sql,stored-procedures,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 我得到了这

所以我有这个存储过程,我试着用几种不同的方式编写,但都没有用

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 GetUserIdUSER_EMAIL,NAME,GENDER”附近使用的正确语法

我已经尝试修补了一段时间

GetUserId可以工作。我试图将结果存储在一个临时变量中,然后插入它,但没有成功


这并非无耻,但如果您能够确定一个解决方案,那么将调用GetUserId存储在变量中的解决方案将是最好的

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

大概是这样的:

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 ;
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 ;
 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 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 ;
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 ;
 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 ;

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

大概是这样的:

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 ;
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 ;
 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 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 ;
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 ;
 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 ;

旧线程,但可以帮助一些人寻找以后。。。 基于fancyPants答案,但更漂亮的是:

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 ;
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 ;
 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 ;

旧线程,但可以帮助一些人寻找以后。。。 基于fancyPants答案,但更漂亮的是:

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 ;
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 ;
 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 ;

GetUserId是一个函数还是一个存储过程?GetUserId是一个函数还是一个存储过程?我删除了旧的过程,现在这个过程给了我一个问题创建过程GetUserId USER\u EMAIL VARCHAR40,OUT USER\u ID INT BEGIN SELECT ID INTO USER\u ID FROM USERS,其中EMAIL=USER\u EMAIL;ENDNo,不要对变量和列使用相同的名称。我不确定你的意思,这个过程只是一个例子,我希望你没有使用它1:1。您已经将我的参数名(以p_u开头)替换为USER_u,这是表的列名。别那样做,会把MySQL搞糊涂的。您是否使用了适当的分隔符?错误消息是什么?我将其更改为p_u,并得到错误1064-您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第3行附近使用的正确语法。我删除了旧程序,现在这一个给了我问题创建程序GetUserIdIN USER_EMAIL VARCHAR40,OUT USER_ID INT BEGIN SELECT ID INTO USER_ID FROM USERS,其中EMAIL=USER_EMAIL;ENDNo,不要对变量和列使用相同的名称。我不确定你的意思,这个过程只是一个例子,我希望你没有使用它1:1。您已经将我的参数名(以p_u开头)替换为USER_u,这是表的列名。别那样做,会把MySQL搞糊涂的。您是否使用了适当的分隔符?错误消息是什么?我将其更改为p_u,并得到错误1064-您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第3行附近要使用的正确语法