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行附近要使用的正确语法