所以我有这个存储过程,我试着写一些不同的方法,但都无济于事。
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存储在变量中的解决方案将是最佳选择。
答案 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 ;