Mysql 存储过程不返回 VARCHAR 输出参数
Mysql Stored Proc not returning a VARCHAR out parameter
下面是我的存储过程。它工作正常,但我的问题是我无法将输出参数设置为 VARCHAR
.
我遇到问题的部分是将 @curcName
分配给输出参数 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
我正在尝试 return 一条消息 IF name
EXISTS
所以它应该是这样的
SET op_resultMessage = @curcName 'already uses the school year and year level you're trying to insert';
但我不知道如何正确连接和分配值。我仍然对 := SET
和 =
运算符感到困惑。我想这就是我遇到问题的地方。
如果我将输出参数的类型更改为 INT
之类的
OUT op_resultMessage VARCHAR(50)
然后分配一个数字给 op_resultMessage
就像 SET op_resultMessage = 1;
它return将数字 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。
谢谢。
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),但这是它现在所在的位置。
下面是我的存储过程。它工作正常,但我的问题是我无法将输出参数设置为 VARCHAR
.
我遇到问题的部分是将 @curcName
分配给输出参数 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
我正在尝试 return 一条消息 IF name
EXISTS
所以它应该是这样的
SET op_resultMessage = @curcName 'already uses the school year and year level you're trying to insert';
但我不知道如何正确连接和分配值。我仍然对 := SET
和 =
运算符感到困惑。我想这就是我遇到问题的地方。
如果我将输出参数的类型更改为 INT
之类的
OUT op_resultMessage VARCHAR(50)
然后分配一个数字给 op_resultMessage
就像 SET op_resultMessage = 1;
它return将数字 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。
谢谢。
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),但这是它现在所在的位置。