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),但这是它现在所在的位置。