區別:1、存儲函數的限制比較多,而存儲過程的限制相對比較少;2、存儲函數會向調用者返回一個且僅有一個結果值,而存儲過程會返回一個或多個結果集;3、存儲過程的參數類型有三種,存儲函數的參數類型只有一種。
本教程操作環境:windows7系統、mysql8版本、Dell G3電腦。
什么是存儲過程?
存儲過程是在大型數據庫系統中,一組為了完成特定功能的SQL語句集,存儲在數據庫中,經過第一次編譯后再次調用不需要再次編譯,用戶通過指定存儲過程的名字和參數(如果該存儲過程有參數)來執行它。存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程。
優點:
(1)重復使用:存儲過程可以重復使用,可以減少開發人員的工作量。
(2)提高效率:存儲過程在第一次使用的時候會編譯,一次編譯后以后不用再次編譯,提高了效率。
(3)減少網絡流量:存儲過程位于服務器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網絡傳輸的數據量。
(4)安全性:參數化的存儲過程可以防止SQL注入,而且可以將Grant、Deny以及Revoke權限應用于存儲過程。
缺點:
(1)調試麻煩
(2)移植性差
(3)維護性差
代碼:
CREATE?DEFINER=`root`@`%`?PROCEDURE?`getName`(IN?`uid`?int,OUT?my_uname?VARCHAR(255)) BEGIN #Routine?body?goes?here... select?admin_name?into?my_uname?from?admin_user?where?id=uid; ??select?my_uname; END
什么是存儲函數?
存儲函數為一組存儲程序,帶函數名、參數,且返回一個結果集。存儲函數和存儲過程的結構類似,但必須有一個return 子句來返回結果。
代碼:
CREATE?DEFINER=`root`@`%`?FUNCTION?`queryChildrenAreaInfo`(areaId?INT)?RETURNS?varchar(4000)?CHARSET?utf8 BEGIN DECLARE?sTemp?VARCHAR(4000); DECLARE?sTempChd?VARCHAR(4000); SET?sTemp='$'; SET?sTempChd?=?CAST(areaId?AS?CHAR); WHILE?sTempChd?IS?NOT?NULL?DO SET?sTemp=?CONCAT(sTemp,',',sTempChd); SELECT?GROUP_CONCAT(id)?INTO?sTempChd?FROM?personal_dept?WHERE?FIND_IN_SET(dept_parentId,sTempChd)>0; END?WHILE; RETURN?sTemp; END
存儲過程和存儲函數的區別
1、總述
存儲過程和存儲函數統稱為存儲例程。兩者的語法很相似,但卻是不同的內容。
存儲函數限制比較多,比如不能用臨時表,只能用表變量。還有一些函數都不可用等等。
而存儲過程的限制就相對比較少,要實現的功能比較復雜一些。
2、返回值上的不同
存儲函數將向調用者返回一個且僅有一個結果值。
存儲過程將返回一個或多個結果集(函數做不到這一點),或者只是來實現某種效果或動作而無需返回結果。
3、調用方式的不同
存儲函數嵌入在sql中使用的,可以在select中調用,就像內置函數一樣,比如cos()、sin()。
4、參數的不同
存儲函數的參數類型類似于IN參數
存儲過程的參數類型有三種:IN參數、OUT參數、INOUT參數
in:數據只是從外部傳入內部使用(值傳遞),可以是數值也可以是變量
out:只允許過程內部使用(不用外部數據),給外部使用的(引用傳遞:外部的數據會被先清空才會進入到內部),只能是變量
inout:外部可以在內部使用,內部修改的也可以給外部使用,典型的引用 傳遞,只能傳遞變量。
存儲過程是用戶定義的一系列sql語句的集合,設計特定表或其它對象的任務,用戶可以調用存儲過程。
而函數通常是數據庫已定義的方法,它接收參數并返回某種類型的值并且不涉及特定用戶表。
【相關推薦:mysql視頻教程】