**目錄**
[TOC]
# 1 使用者變量
MySQL數據庫服務器提供一種簡易的儲存資料方式,稱為“使用者變量、user variables”。使用者變量儲存一些簡單的資料,例如數字或字串,它們可以在后續的操作中使用。下列是設定使用者變量的語法:
[](http://box.kancloud.cn/2015-09-15_55f7ef88abe52.png)
下列的敘述設定兩個儲存字串資料的使用者變量:
[](http://box.kancloud.cn/2015-09-15_55f7ef8bacf3d.png)
設定好使用者變量以后,你可以在“SELECT”敘述中查詢它們儲存的內容:
[](http://box.kancloud.cn/2015-09-15_55f7ef8c0150c.png)
如果你需要設定多個變量的話,可以在一個“SET”敘述中設定多個需要的使用者變量:
[](http://box.kancloud.cn/2015-09-15_55f7ef9137382.png)
使用查詢敘可以確認上列的敘述已經設定好的兩個使用者變量:
[](http://box.kancloud.cn/2015-09-15_55f7efa09b80f.png)
使用“SELECT”敘述也可以設定需要的使用者變量,不過要特別注意指定的符號只能使用“:=”:
[](http://box.kancloud.cn/2015-09-15_55f7efa1433c0.png)
下列的敘述設定兩個儲存整數資料的使用者變量,因為是使用“SELECT”敘述,所以設定好使用者變量以后,也會顯示設定的使用者變量內容:
[](http://box.kancloud.cn/2015-09-15_55f7efa1a1461.png)
再使用查詢敘確認上列的敘述已經設定好的兩個使用者變量:
[](http://box.kancloud.cn/2015-09-15_55f7efa229afb.png)
已經設定好的使用者變量,可以使用在大部份的敘述中,例如下列的范例使用變量來設定查詢敘述的條件設定:
[](http://box.kancloud.cn/2015-09-15_55f7efa287250.png)
使用“SELECT”敘述設定使用者變量的方式,也可以直接把查詢敘述傳回的資料儲存起來:
[](http://box.kancloud.cn/2015-09-15_55f7efa2d55de.png)
上列范例執行后所設定的使用者變量,也可以使用在后續的敘述中:
[](http://box.kancloud.cn/2015-09-15_55f7efa3631d0.png)
你也可以拿使用者變量來執行需要的運算:
[](http://box.kancloud.cn/2015-09-15_55f7efa3c1233.png)
注:“LIMIT”子句指定的數字不可以使用變量。
# 2 Prepared Statements的應用
一個數據庫在建立好并開始使用以后,數據庫服務器就會接收各種不同的敘述來執行工作。以查詢敘述來說,有一些敘述可能大部份的內容都是一樣的,只有在條件的設定上會不一樣。就算這些敘述的內容是差不多的,數據庫服務器每次接收到敘述時,還是要執行一些同樣的工作:
[](http://box.kancloud.cn/2015-09-15_55f7efa478f37.png)
如果有“許多要執行的敘述,可是內容卻相似”的情況,可以使用“Prepared statements”改善數據庫的效率。首先,你要把這種敘述先準備好:
[](http://box.kancloud.cn/2015-09-15_55f7efa9f20a5.png)
服務器已經準備好的敘述就稱為“prepared statement”,后續要使用這種敘述前,要先設定好prepared statement需要的資料。在上列的范例中,因為prepared statement的內容中有一個問號,所以你要先設定好一個資料,也就是國家的代碼。然后再請服務器執行指定的prepared statement,服務器就會傳回執行后的結果了:
[](http://box.kancloud.cn/2015-09-15_55f7efaa8a62d.png)
# 3 建立、執行與移除Prepared Statements
如果有“許多要執行的敘述,可是內容卻相似”的情形,你就可以考慮請服務器把這種敘述建立為prepared statement。下列是建立prepared statement的語法:
[](http://box.kancloud.cn/2015-09-15_55f7efab487cd.png)
如果常需要查詢某個國家的代碼、名稱與GNP的話,你可以建立一個下列的prepared statement。敘述中的問號是“參數標記、parameter marker”,表示執行這個prepared statement需要一個參數資料:
[](http://box.kancloud.cn/2015-09-15_55f7efab9018c.png)
建立好需要的prepared statement以后,你必須使用“EXECUTE”來執行它:
[](http://box.kancloud.cn/2015-09-15_55f7efabe329b.png)
執行一個prepared statement并不一定需要傳送資料給它,要依據prepared statement包含的敘述中有沒有問號來決定。如果有問號的話,一個問號就需要先設定好一個使用者變量,然后再使用“USING”傳送資料給prepared statement使用:
[](http://box.kancloud.cn/2015-09-15_55f7efac7687a.png)
后續要執行這個查詢時,只要依照同樣的步驟就可以查詢別個國家資料了:
[](http://box.kancloud.cn/2015-09-15_55f7efad67190.png)
如果一個prepared statement已經不需要了,你可以使用下列的語法,從服務器中刪除指定的prepared statement:
[](http://box.kancloud.cn/2015-09-15_55f7efadab667.png)
下列的敘述執行以后會刪除名稱為“my_country”的prepared statement:
[](http://box.kancloud.cn/2015-09-15_55f7efb2e0a7f.png)
# 4 Prepared Statements的參數
在建立prepared statement時,你會依照敘述的需求設定參數標記,這些參數標記也決定執行prepared statement時,須要傳多少參數資料給它才可以正確的執行。以下列新增紀錄的敘述來說,它就使用了三個參數標記,依序為部門編號、名稱與地點:
[](http://box.kancloud.cn/2015-09-15_55f7efb330798.png)
根據prepared statement使用的參數標記,在執行prepared statement時一定傳送正確的參數資料,否則會產生錯誤訊息:
[](http://box.kancloud.cn/2015-09-15_55f7efb388717.png)
下列的范例先把要新增部門的編號、名稱與地點資料設定為使用者變量,在執行“new_dept”時傳送給它使用:
[](http://box.kancloud.cn/2015-09-15_55f7efb3c1f02.png)
如果傳送的參數數量不對的話,就會產生錯誤訊息:
[](http://box.kancloud.cn/2015-09-15_55f7efb44a88d.png)
如果傳送的使用者變量不存在的話,會自動使用“NULL”值代替:
[](http://box.kancloud.cn/2015-09-15_55f7efb498cbc.png)
# 5 有效范圍
所有使用者變量與prepared statements都是某一個用戶端專屬的:
[](http://box.kancloud.cn/2015-09-15_55f7efb4ebe4b.png)
如果用戶端離線以后,他所設定的使用者變量與prepared statements都會被清除:
[](http://box.kancloud.cn/2015-09-15_55f7efb57ee1b.png)
所以建立prepared statements時,不可以指定它是屬于哪一個數據庫,否則會有錯誤訊息:
[](http://box.kancloud.cn/2015-09-15_55f7efb5c9585.png)