Mysql存儲過程裏面的變量目前我發現有三種,第一是參數傳遞進來的變量,第二是DECLARE聲明的變量,第三中形式像@x之類的,我就叫它@變量(隨便起的,嘿嘿)
最近發現@變量有一個問題,比如:
DELIMITER $$
DROP PROCEDURE IF EXISTS test1$$
CREATE PROCEDURE test1(IN a INT)
BEGIN
#--沒有初始化的@x
SELECT @x ;
IF a = 1 THEN
#--如果a=1則把a的值付給@x
SET @x = a ;
END IF ;
END ;$$
DELIMITER ;
#--第一次執行
CALL test1(1) ;
#--第二次執行
CALL test1(1) ;
執行結果:
第一次執行test1()的時候,@x沒有初始化,所以打印出來爲null,下面的if語句中,a爲@x變量賦值爲1,所以第二次就會打印出@x=1。
爲什麼會這樣?後來我查過網上一些資料,@變量的生命週期是在一個一個session裏,也就是說,即使我執行完了這個存儲過程,@x還會存在,並且參加下一次的運算,這會產生很多的問題,因爲這樣,@x的值就不能被控制了,特別是在比如像Java程序運行的時候,@x什麼時候歸0,什麼時候保存上次的變量我們無法估計。
我把上面的Mysql Session中斷之後重新執行,執行結果:
@x重新變爲null。如果@變量不初始化,會產生很多問題,但Mysql的@變量不像Java程序,會報異常提示終止,Mysql是直接執行,結果怎樣只能靠自己去判斷了。
把程序改爲:
DELIMITER $$
DROP PROCEDURE IF EXISTS test1$$
CREATE PROCEDURE test1(IN a INT)
BEGIN
#--初始化@x
SET @x = 0 ;
SELECT @x ;
IF a = 1 THEN
#--如果a=1則把a的值付給@x
SET @x = a ;
END IF ;
END ;$$
DELIMITER ;
這樣執行結果:
這樣就可以控制@變量,不讓它產生奇怪的後果。
~綜:Mysql使用@變量一定必須要初始化!