本文介紹的某些限制適用於所有的存儲子程序,即存儲程序和存儲函數。某些限制僅適用於存儲函數而不是存儲程序。
對存儲函數的的所有限制也適用於觸發程序。
注釋:如果SQL語句,如SELECT ... INTO語句包含具有相同名稱的對列的引用以及聲明的局部變量,MySQL會將引用解釋為變量的名稱。這是一種非標准的行為,優先順序通常是列名、然後是SQL變量和參數。
存儲子程序不能包含任意SQL語句。在存儲子程序中,禁止使用下述語句:
·CHECK TABLES ·LOCK TABLES, UNLOCK TABLES ·LOAD DATA, LOAD TABLE
·SQL預處理語句(PREPARE、EXECUTE、DEALLOCATE PREPARE)。隱含意義:不能在存儲子程序中使用動態SQL語句(其中,能夠以字符串形式構造動態語句,然後執行它們)。從MySQL 5.0.13開始,對於存儲程序放寬了該限制,但該限制仍適用於存儲函數和觸發程序。
·OPTIMIZE TABLE
對於存儲函數(而不是存儲程序),禁止下述額外語句:
·執行顯式或隱式提交或回滾操作的語句。
·返回結果集的語句。包括沒有INFO子句的SELECT語句,以及SHOW語句。能夠用SELECT … INTO,或使用光標和FETCH語句處理結果集的函數。
·FLUSH語句。注意,盡管能夠在存儲程序中使用FLUSH,但不能從存儲函數或觸發程序調用這類存儲程序。
注意,盡管某些限制在正常情況下適用於存儲函數和觸發程序,不適用於存儲程序,如果它們是從存儲函數或觸發程序中調用的,這些限制也適用於存儲程序。
使用存儲子程序會導致復制問題。
INFORMATION_SCHEMA尚不包含PARAMETERS表,因此,對於需要在運行時獲取子程序參數信息的應用程序來說,必須采用相應的規避錯誤,如解析SHOW CREATE語句的輸出。
沒有存儲子程序調試工具。
存儲子程序使用了具體化的光標,而不是固有光標(在服務器端生成結果集並對結果集進行高速緩沖處理,然後在客戶端獲取結果集時按行返回)。
不能提前處理CALL語句。無論是對服務器端預處理語句還是SQL預處理語句,均成立。
為了防止服務器線程間的交互問題,當客戶端發出語句時,服務器將使用可用的、用於語句執行的子程序和觸發程序快照。也就是說,服務器將計算出可在語句執行期間使用的存儲程序、函數和觸發程序的列表,加載它們,然後進入語句執行。這意味著,在語句執行的同時,它不會看到其他線程對子程序所作的變更。