As we all know,MySQL的存儲過程就相似於腳本,既然似腳本就會有使用到變量的時候。mysql
MySQL存儲過程常見的變量:局部變量、用戶變量、系統變量……sql
在過程體中,能夠聲明局部變量,用來臨時保存一些值。數組
一、定義局部變量語法:服務器
DECLARE var_name[, var_name] ... type [DEFAULT value];session
其中,type爲MySQL的數據類型,如:int、float、date、varchar(length)spa
注意:3d
①DECLARE用來聲明局部變量,且DECLARE僅被用在BEGIN ... END複合語句裏,而且必須在複合語句的開頭,在任何其它語句以前;能夠被用在嵌套的塊中,除了那些用相同名字聲明變量的塊。code
②若是要給變量提供一個默認值,使用DEFAULT子句(值能夠是常數,也能夠指定爲一個表達式);若是沒有DEFAULT子句,初始值爲NULL。blog
二、基本格式:
CREATE PROCEDURE sp_name ([proc_parameter[,...]])
BEGIN
DECLARE var_name1 type [DEFAULT value];
DECLARE var_name2 type [DEFAULT value];
DECLARE……;
[characteristic ...];
END
例1:建立過程,爲局部變量指定默認值,並調用該過程
mysql> delimiter $$ mysql> create procedure test1(out num1 int) -> begin -> declare num2 int default 100; -> set num1=num2; -> end -> $$ mysql> delimiter ; mysql> call test1(@num); mysql> select @num; +------+
| @num |
+------+
| 100 |
+------+
解析:
建立test1存儲過程:輸出的是num1變量的值,聲明局部變量num2是int類型、默認值是100,用set將num2的值(未處理,則默認值)賦給num1;
調用test1:用用戶變量num去接收存儲過程的輸出值num1……
默認值除了字面量,還能夠是複雜的表達式,包括標量子查詢
例2:建立過程,使用全部球員的數量來初始化一個變量
mysql> delimiter $$ mysql> create procedure test2(out num1 int) -> begin -> declare num2 int default(select count(*) from PLAYERS); -> set num1=num2; -> end$$ mysql> delimiter ; mysql> call test2(@num); mysql> select @num; +------+
| @num |
+------+
| 14 |
+------+
注意:MySQL不支持數組做爲局部變量。
三、局部變量的做用域:
也就是變量能正常使用而不出錯的程序塊的範圍。
在嵌套塊的狀況下,
在外部塊中聲明的變量能夠在內部塊中直接使用;
在內部塊中聲明的變量只能在內部塊中使用。
解析:變量v2只能用在內部塊b2中,塊b3中的set語句和最後一條set語句都是錯誤的。
>用戶變量與數據庫鏈接有關:在當前鏈接中聲明的變量,在鏈接斷開的時候,就會消失;在此鏈接中聲明的變量沒法在另外一鏈接中使用。
>一個@符號表示的就是用戶變量。
一、用戶變量的定義(set、select):
1)set語句爲用戶變量賦值:
可使用「=」或「:=」做爲分配符;
分配給每一個變量的expr能夠爲整數、實數、字符串或者NULL值;
mysql> set @zjc:=999; mysql> select @zjc; +------+
| @zjc |
+------+
| 999 |
+------+
2)select語句爲用戶變量賦值:
分配符必須爲「:=」而不能用「=」,由於在非SET語句中=被視爲一個比較操做符;
mysql> select @abc:=123; +-----------+
| @abc:=123 |
+-----------+
| 123 |
+-----------+ mysql> select @abc; +------+
| @abc |
+------+
| 123 |
+------+
注意:
①用戶變量隨處能夠定義,隨處可使用;不定義能夠直接使用(值默認爲null)。
②用戶變量的變量名的形式:@var_name,要有@符號。
③濫用用戶變量會致使程序難以理解及管理。
拓展之變量賦值:set語法
MySQL裏面的變量是不嚴格限制數據類型的,變量的數據類型根據賦給變量的值而隨時變化。
SET variable_assignment [, variable_assignment] ... variable_assignment: user_var_name = expr |[GLOBAL | SESSION] system_var_name = expr |[@@global. | @@session. | @@] system_var_name = expr
##用來給用戶變量、系統變量賦值,也能夠給過程當中的局部變量賦值。
注意:
set系統變量時,不帶做用域修飾,默認是指會話做用域;
(特別注意,有些系統變量不帶做用域修飾,沒法設置,所以最好都帶上做用域設置系統變量)。
二、用戶變量的做用域
只要是在當前鏈接定義的用戶變量,在當前鏈接裏用都是OK的,除此以外都不行。
三、與局部變量區別:
局部變量只有變量名字,沒有@符號;用戶變量名前有@符號。
都是先定義,再使用;未定義的變量,select值爲空。
局部變量只在存儲過程內部使用,在過程體外是沒有意義的,當begin-end塊處理完後,局部變量就消失;而用戶變量能夠用在存儲過程的內部和外部。
Tips:在存儲過程內部,使用局部變量,不要使用用戶變量。
一、用戶變量如上所述@var_name(一個@符號)
①用戶變量和數據庫鏈接有關,鏈接後聲明變量,鏈接斷開後,自動消失;
②select一個沒有賦值的用戶變量,返回NULL,也就是沒有值;
Mysql的變量相似於動態語言,變量的值隨所要賦的值的類型而改變。
二、系統變量:根據系統變量的做用域分爲:全局變量與會話變量(兩個@符號)
①全局變量(@@global.)
在MySQL啓動的時候由服務器自動將全局變量初始化爲默認值;
全局變量的默認值能夠經過更改MySQL配置文件(my.ini、my.cnf)來更改。
②會話變量(@@session.)
在每次創建一個新的鏈接的時候,由MySQL來初始化;
MYSQL會將當前全部全局變量的值複製一份來作爲會話變量(也就是說,若是在創建會話之後,沒有手動更改過會話變量與全局變量的值,那全部這些變量的值都是同樣的)。
#全局變量與會話變量的區別:對全局變量的修改會影響到整個服務器,可是對會話變量的修改,只會影響到當前的會話。