2013-06-04 21 views
0

我遇到一些奇怪的行爲,其中存儲過程似乎是緩存變量值或調用之間存儲過程的輸出。這裏有一個場景:如何防止MySQL在存儲過程調用之間緩存變量值?

表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! 

不要緊,我改變了存儲過程主體 - 它仍然在var testVar中緩存值5。獲取值自行糾正的唯一方法是斷開連接然後重新連接。然後當我調用存儲過程的第二個版本時,它會按預期返回一個空值。

回答

4

@用戶變量,它們是會話特定的。你想要使用不應該有@前綴的局部變量。從存儲過程聲明中刪除它。

+0

優秀,謝謝 – user2453461