我遇到了一些奇怪的行为,其中存储过程似乎正在缓存变量值或调用之间存储过程的输出。这是一个场景:
表 foo
id INT(10);
name VARCHAR2(100);
有一行,id=5 和 name="a_valid_value"
DELIMITER $$
CREATE PROCEDURE fooProc()
BEGIN
DECLARE testVar INT;
SELECT id into @testVar FROM foo WHERE name = 'a_valid_value';
SELECT @testVar as "testVar";
END;
$$
delimiter ;
CALL fooProc(); -- Outputs 5 as expected
DROP PROCEDURE fooProc;
DELIMITER $$
CREATE PROCEDURE fooProc()
BEGIN
DECLARE testVar INT;
SELECT id into @testVar FROM foo WHERE name = 'NONEXISTENT_VALUE';
SELECT @testVar as "testVar";
END;
$$
delimiter ;
CALL fooProc(); -- Outputs 5!
我更改了存储过程主体并不重要——它仍然在 var 中缓存值 5 testVar
。使值自行更正的唯一方法是断开连接然后重新连接。然后,当我调用存储过程的第二个版本时,它会按预期返回一个空值。