mysql存儲過程和存儲函數有什么區別

區別:1、存儲函數的限制比較多,而存儲過程的限制相對比較少;2、存儲函數會向調用者返回一個且僅有一個結果值,而存儲過程會返回一個或多個結果集;3、存儲過程的參數類型有三種,存儲函數的參數類型只有一種。

mysql存儲過程和存儲函數有什么區別

本教程操作環境: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視頻教程

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享