存儲函數與存儲過程的區別

1. 讀寫權限不同

存儲函數:設計之初的目的是隻讀的(但是實際並沒有嚴格限制)
存儲過程:可讀可寫

存儲函數的讀寫權限這裏要特殊說明一下:
創建存儲函數的時候後,必須聲明函數讀寫權限,且只能在DETERMINISTIC, NO SQL, or READS SQL DATA中選擇。這三者的含義爲確定性、無SQL語句、只對數據庫進行讀操作。
如果沒有聲明讀寫權限,就會報下面的錯誤:

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

如果想不報錯,除了聲明參數還有一個辦法,執行SET GLOBAL log_bin_trust_routine_creators = 1;命令來禁止掉對SUPER權限的要求。

注意:雖然存儲函數的聲明要求是隻讀的,但是卻不會對函數中的語句進行檢查,所有我們仍然可以在存儲函數中進行寫數據庫的操作。

2. 返回不同

存儲函數:必須有返回值
存儲過程:返回值可有可無,通過OUT參數返回

3. 調用方式不同

存儲函數:只能在sql語句中調用,比如:select function();
存儲過程:只能單獨調用,比如:call procedure();

總結

綜上所述,可以看出存儲函數與存儲過程在設計上還是用不一樣的地方

  • 存儲函數:是爲了計算一些東西
  • 存儲過程:是一些sql語句的集合
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章