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語句的集合