程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 細化解析:對存儲子程序和觸發程序的限制

細化解析:對存儲子程序和觸發程序的限制

編輯:關於MYSQL數據庫

本文介紹的某些限制適用於所有的存儲子程序,即存儲程序和存儲函數。某些限制僅適用於存儲函數而不是存儲程序。

 

對存儲函數的的所有限制也適用於觸發程序。

 

注釋:如果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預處理語句,均成立。

 

為了防止服務器線程間的交互問題,當客戶端發出語句時,服務器將使用可用的、用於語句執行的子程序和觸發程序快照。也就是說,服務器將計算出可在語句執行期間使用的存儲程序、函數和觸發程序的列表,加載它們,然後進入語句執行。這意味著,在語句執行的同時,它不會看到其他線程對子程序所作的變更。 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved