1

所以我有这个存储过程,我尝试写了几种不同的方式,都无济于事。

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 存储在变量中的解决方案将是最好的。

4

2 回答 2

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 ;
于 2013-09-22T07:24:27.943 回答
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 ;
于 2016-08-25T03:03:45.607 回答