0

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

表 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。使值自行更正的唯一方法是断开连接然后重新连接。然后,当我调用存储过程的第二个版本时,它会按预期返回一个空值。

4

1 回答 1

4

@用户变量,它们是特定于会话的。您想使用不应具有@前缀的局部变量。从存储过程声明中删除它。

于 2013-06-04T21:12:24.177 回答