您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“mysql存儲過程和存儲函數有哪些區別”,內容詳細,步驟清晰,細節處理妥當,希望這篇“mysql存儲過程和存儲函數有哪些區別”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
區別: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存儲過程和存儲函數有哪些區別”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。