宣告變數 - declare 和 set

  1. 1. declare 只能在 begin 和 end 之間
  2. 2. set 的用法
  3. 3. declare 和 set 的差異

原本都是在 MSSQL 寫預存程序,都沒有遇到什麼問題,不知道只是換成在 MySql 寫就一直依靠 Google 大神…


1
2
3
declare @num int default 0;
set @num = 1;
select @num;

我期望會得到 1 這個結果。

我沒有嗑過任何有關 MySql 的文件直覺就是覺得這應該就是宣告變數的一般寫法,可是不知道為什麼卻一直遇到問題,後來一直亂試,發現把 declare 那一行拿掉就可以,但是還是不懂,所以就開始請教百度大神(因為現在人在大陸)和 MySql 的文件。發現原來宣告變數有這麼多眉眉角角…


declare 只能在 begin 和 end 之間

參考來源:http://www.jb51.net/article/99856.htm

一般來說,如果是寫 function 或 procedure 使用 declare 是沒有問題的,因為應該都會在 begin 和 end 之間寫。

但會有另外一個問題,後面會說到,一個個慢慢來。

set 的用法

在 MySql 裡面這樣寫

1
2
set @a = 1;
select @a;

你會得到 1

繼續輸入

1
2
@a = @a + 1;
select @a;

你會得到 2

@a 這個變數值即使在直述句 (expression) 執行完畢仍會記憶起來,在 MySql 的文件裡稱 @a 為 user-defined variable 使用者定義變數,在百度的搜尋結果,他們又稱 sesison variable 會話變數,我覺得會話變數比較貼切。

因為如果你使用 exit 離開 MySql,之後再重新登入 MySql (可以使用同個帳戶),再次執行

1
2
@a = @a + 1;
select @a;

你會得到 Null 值,因為 @a 原本的值已經被遺忘了,變成沒有宣告過的 Null,Null + 1 還是 Null


declare 和 set 的差異

根據百度的搜尋結果得知,

  • declare 的限制是要在 begin 和 end 之間使用。
  • set 所宣告的變數會被記憶道使用者離開

因此可以得知他們變數的 scope field 可以使用的區域,defalre 就像是在 function 內宣告的變數,只有 function 使用才會符合一般邏輯,否則就會出現錯誤,或者不如自己的預期;set 所宣告的變數,即使在 function 內宣告,可是離開了 function 操作仍是被允許的,所以要小心會不會和其他 function 或 procedure 命名衝突,導致有非預期的變化。


參考資料:

浅谈MySQL存储过程中declare和set定义变量的区别

User-Defined Variables