在 mysql 中创建和执行存储过程时出现问题

Problem when creating and executing stored procedure in mysql

我在 MySQL 中创建了一个存储过程。它必须获取 5 个不同列的值并根据输入参数执行计算并将计算值更新为 table。我能够创建存储过程,但是在执行它时,它会抛出一个错误,指出 'MYSQL said: #1172 - Result consisted of more than one row.'

下面是我的存储过程

DELIMITER $$
CREATE DEFINER=`andrew`@`localhost` PROCEDURE `st_update_userpoints`(
     in point int,
     in gold int,
     in silver int,
     in bronze int,
     in userId int)
BEGIN
     DECLARE _gold int default 0;
     DECLARE _silver int default 0;
     DECLARE _bronze int default 0;
     DECLARE _points int default 0;
     DECLARE _score int default 0;
     
     select `goldMedal`,`silverMedal`,`bronzeMedal`,`totalPoints`,`score` into @_gold,@_silver,@_bronze,@_points,@_score from `userpoints` where `userId`=userId;
     
     set _gold:=(@_gold+gold);
     set _silver:=(@_silver+silver);
     set _bronze:=(@_bronze+bronze);
     set _points:=(@_points+points);
     set _score = (@_gold*5)+(@_silver+3)+(@_bronze)+(@_points);
     
     update `userpoints` set `goldMedal`=@_gold, `silverMedal`=@_silver, `bronzeMedal`=@_bronze, `totalPoints`=@_points,
     `score`=@_score where `userId`=userId;
     END$$
DELIMITER ;

where `userId`=userId 对左右部分使用 in userId int 输入参数值。因此它总是 TRUE 除了 userpoints.userId 为 NULL 的行(在这种情况下查询 returns 多行),并且如果提供的参数值为 NULL(并且查询没有 return 行)。

使用where userpoints.userId=userId - 在这种情况下,左侧值是列值,右侧值是提供的参数值。我会检查提供的 NULL 值...

终于更正了存储过程

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `st_update_userpoints`(
     in points int,
     in gold int,
     in silver int,
     in bronze int,
     in userId int)
BEGIN
     DECLARE _gold int default 0;
     DECLARE _silver int default 0;
     DECLARE _bronze int default 0;
     DECLARE _points int default 0;
     DECLARE _score int default 0;
     
     select `goldMedal`,`silverMedal`,`bronzeMedal`,`totalPoints`,`score` into _gold,_silver,_bronze,_points,_score from `userpoints` where `userpoints`.`userId`=userId;
     
     set _gold:=(_gold+gold);
     set _silver:=(_silver+silver);
     set _bronze:=(_bronze+bronze);
     set _points:=(_points+points);
     set _score = (_gold*5)+(_silver*3)+(_bronze*1)+(_points);
     
     update `userpoints` set `goldMedal`=_gold, `silverMedal`=_silver, `bronzeMedal`=_bronze, `totalPoints`=_points,
     `score`=_score where `userpoints`.`userId`=userId;
     END $$
DELIMITER ;