我遇到一些奇怪的行为,其中存储过程似乎在两次调用之间缓存变量值或存储过程的输出。这是一个场景:

表foo

id INT(10);
name VARCHAR2(100);


一行,id = 5,名称=“ 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!


更改存储过程主体并不重要-它仍将值5缓存在var testVar中。获取值以更正其自身的唯一方法是先断开连接,然后再重新连接。然后,当我调用存储过程的第二个版本时,它会按预期返回一个空值。

最佳答案

@是用户变量,特定于会话。您要使用不带@前缀的局部变量。从存储过程声明中将其删除。

关于mysql - 如何防止MySQL在存储过程调用之间缓存变量值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16927515/

10-11 05:13
查看更多