MySQL存储过程返回错误值

5

我是MySQL存储过程的新手,正在按照一些教程学习如何使用它们,但在以下内容中遇到了一个有趣的问题:

DELIMITER $$
CREATE DEFINER=`user`@`%` PROCEDURE `CalculateScores`(IN ID INT, OUT test INT)
BEGIN
    SELECT COUNT(*)
    INTO test
    FROM myTable
    WHERE id = ID;
END$$
DELIMITER ;

我用以下命令来运行它:
CALL CalculateScores(252, @test);

然后只需:
SELECT @test;

奇怪的事情是,@test 返回整个表的总行数,而不仅仅是我作为参数发送的 id
我错过了什么?教程从未提到过这一点,我找不到为什么会发生这种情况的答案,我可能不擅长搜索...

可能是重复问题:https://dev59.com/eXTYa4cB1Zd3GeqPvYLo - Norman
哈哈,问题解决了,谢谢你指导我正确的方向 =) - Robin Persson
1个回答

6

看起来MySQL无法区分idID

SELECT COUNT(*)
INTO test
FROM myTable
WHERE id = ID;

它将其视为1=1,这总是成立的(如果列不可为空)。


您可以添加别名来指示id是列而不是参数。

CREATE PROCEDURE `CalculateScores`(IN ID INT, OUT test INT)
BEGIN
    SELECT COUNT(*)
    INTO test
    FROM myTable t
    WHERE t.id = ID;
END

db<>fiddle demo


1
哇!这太有帮助了!我很难相信MYSQL中设计的一些东西。他们应该设法让数据库编译器在参数和字段之间区分。这种问题在SQL Server中不存在,可能在Oracle中也不存在。 - John Foll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接