以下是我的存储过程。它工作正常但我的问题是我无法将输出参数作为VARCHAR
。
我遇到问题的部分是将@curcName
分配给out参数op_resultMessage
BEGIN
SET op_resultMessage = @curcName;
END;
这是存储过程。
CREATE DEFINER=`root`@`localhost` PROCEDURE `addCurriculum`(
IN p_curcName varchar(100),
IN p_description TEXT,
IN p_yearLevel VARCHAR(50),
IN p_syStart INT,
IN p_syEnd INT,
IN p_creator VARCHAR(50),
OUT op_resultMessage VARCHAR(50))
BEGIN
DECLARE curcName VARCHAR(20) ;
IF EXISTS
(SELECT @curcName := `name`
FROM curriculum
WHERE
yearLevel = p_yearLevel
AND syStart = p_syStart
AND syEnd = p_syEnd )
THEN --
BEGIN
SET op_resultMessage = @curcName;
END;
ELSE
BEGIN
INSERT INTO curriculum(`name`, description, yearLevel, syStart, syEnd, creator)
VALUES(p_curcName,p_description,p_yearLevel,p_syStart,p_syEnd,p_creator);
END;
END IF;
END
我试图回复邮件name
EXISTS
所以它应该像
SET op_resultMessage = @curcName 'already uses the school year and year level you're trying to insert';
但我不知道如何正确连接和分配值。我仍然对:= SET
和=
运营商感到困惑。我想这就是我遇到问题的地方。
如果我将out参数的类型更改为INT
类似
OUT op_resultMessage VARCHAR(50)
然后将数字分配给op_resultMessage
,如SET op_resultMessage = 1;
它返回数字1作为输出参数值。它只是不能使用varchar。
所以当我尝试调用程序时
CALL `enrollmentdb`.`addCurriculum`
('Test Curriculum ','Test ','Grade 1',2015,2016,'jordan',@outputMsg);
SELECT @outputMsg; -- this doesn't return any value even if Grade 1, 2015 and 2016 exists
我很感激任何帮助。我其实刚刚学习了mysql。
感谢。
答案 0 :(得分:1)
drop procedure if exists addCurriculum;
delimiter $$
CREATE PROCEDURE `addCurriculum`(
IN p_curcName varchar(100),
IN p_description TEXT,
IN p_yearLevel VARCHAR(50),
IN p_syStart INT,
IN p_syEnd INT,
IN p_creator VARCHAR(50),
OUT op_resultMessage VARCHAR(50))
BEGIN
DECLARE curcName VARCHAR(20) ;
SELECT `name` into @curcName
FROM curriculum
WHERE
yearLevel = p_yearLevel
AND syStart = p_syStart
AND syEnd = p_syEnd
LIMIT 1;
-- Note change above. When selecting into a variable (or more than 1)
-- then 0 or 1 rows can come back max or an Error occurs
IF @curcName is not null then
SET op_resultMessage = @curcName;
ELSE
BEGIN
INSERT INTO curriculum(`name`, description, yearLevel, syStart, syEnd, creator)
VALUES(p_curcName,p_description,p_yearLevel,p_syStart,p_syEnd,p_creator);
END;
SET op_resultMessage = 'GEEZ I am right here'; -- Drew added this
END IF;
END$$
delimiter ;
请注意存储过程中的注释,尤其是返回0或1行的部分,否则将出现select into var
模式的错误。所以LIMIT 1
。这可能是也可能不是您想要的行(限制1),但这就是它现在的位置。