在 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 ;
我在 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 ;