Prepared Statement
1 使用者變數
MySQL資料庫伺服器提供一種簡易的儲存資料方式,稱為「使用者變數、user variables」。使用者變數儲存一些簡單的資料,例如數字或字串,它們可以在後續的操作中使用。下列是設定使用者變數的語法:
下列的敘述設定兩個儲存字串資料的使用者變數:
設定好使用者變數以後,你可以在「SELECT」敘述中查詢它們儲存的內容:
如果你需要設定多個變數的話,可以在一個「SET」敘述中設定多個需要的使用者變數:
使用查詢敘可以確認上列的敘述已經設定好的兩個使用者變數:
使用「SELECT」敘述也可以設定需要的使用者變數,不過要特別注意指定的符號只能使用「:=」:
下列的敘述設定兩個儲存整數資料的使用者變數,因為是使用「SELECT」敘述,所以設定好使用者變數以後,也會顯示設定的使用者變數內容:
再使用查詢敘確認上列的敘述已經設定好的兩個使用者變數:
已經設定好的使用者變數,可以使用在大部份的敘述中,例如下列的範例使用變數來設定查詢敘述的條件設定:
使用「SELECT」敘述設定使用者變數的方式,也可以直接把查詢敘述傳回的資料儲存起來:
上列範例執行後所設定的使用者變數,也可以使用在後續的敘述中:
你也可以拿使用者變數來執行需要的運算:
註:「LIMIT」子句指定的數字不可以使用變數。
2 Prepared Statements的應用
一個資料庫在建立好並開始使用以後,資料庫伺服器就會接收各種不同的敘述來執行工作。以查詢敘述來說,有一些敘述可能大部份的內容都是一樣的,只有在條件的設定上會不一樣。就算這些敘述的內容是差不多的,資料庫伺服器每次接收到敘述時,還是要執行一些同樣的工作:
如果有「許多要執行的敘述,可是內容卻相似」的情況,可以使用「Prepared statements」改善資料庫的效率。首先,你要把這種敘述先準備好:
伺服器已經準備好的敘述就稱為「prepared statement」,後續要使用這種敘述前,要先設定好prepared statement需要的資料。在上列的範例中,因為prepared statement的內容中有一個問號,所以你要先設定好一個資料,也就是國家的代碼。然後再請伺服器執行指定的prepared statement,伺服器就會傳回執行後的結果了:
3 建立、執行與移除Prepared Statements
如果有「許多要執行的敘述,可是內容卻相似」的情形,你就可以考慮請伺服器把這種敘述建立為prepared statement。下列是建立prepared statement的語法:
如果常需要查詢某個國家的代碼、名稱與GNP的話,你可以建立一個下列的prepared statement。敘述中的問號是「參數標記、parameter marker」,表示執行這個prepared statement需要一個參數資料:
建立好需要的prepared statement以後,你必須使用「EXECUTE」來執行它:
執行一個prepared statement並不一定需要傳送資料給它,要依據prepared statement包含的敘述中有沒有問號來決定。如果有問號的話,一個問號就需要先設定好一個使用者變數,然後再使用「USING」傳送資料給prepared statement使用:
後續要執行這個查詢時,只要依照同樣的步驟就可以查詢別個國家資料了:
如果一個prepared statement已經不需要了,你可以使用下列的語法,從伺服器中刪除指定的prepared statement:
下列的敘述執行以後會刪除名稱為「my_country」的prepared statement:
4 Prepared Statements的參數
在建立prepared statement時,你會依照敘述的需求設定參數標記,這些參數標記也決定執行prepared statement時,須要傳多少參數資料給它才可以正確的執行。以下列新增紀錄的敘述來說,它就使用了三個參數標記,依序為部門編號、名稱與地點:
根據prepared statement使用的參數標記,在執行prepared statement時一定傳送正確的參數資料,否則會產生錯誤訊息:
下列的範例先把要新增部門的編號、名稱與地點資料設定為使用者變數,在執行「new_dept」時傳送給它使用:
如果傳送的參數數量不對的話,就會產生錯誤訊息:
如果傳送的使用者變數不存在的話,會自動使用「NULL」值代替:
5 有效範圍
所有使用者變數與prepared statements都是某一個用戶端專屬的:
如果用戶端離線以後,他所設定的使用者變數與prepared statements都會被清除:
所以建立prepared statements時,不可以指定它是屬於哪一個資料庫,否則會有錯誤訊息: