Mysql存儲過程(二)

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使用@變量一定必須要初始化!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章